程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Linq學習(7) 延遲執行 & 查詢非泛型集合(3)

Linq學習(7) 延遲執行 & 查詢非泛型集合(3)

編輯:關於C語言

為了更清楚的演示延遲執行的執行時間,自己實現 IEnumerator<T> 接口,通過下面代碼可以看出,查詢操作是在 GetEnumerator() 方法中執行的。

static void Main()
{
  int[] collection = { 10, 11, 12, 13, 14 };
  var result = from i in GetEnumerator(collection)
         select i;
  foreach (var i in result)
  {
    Console.WriteLine(i);
  }
}
public static IEnumerable<int> GetEnumerator(int[] collection)
{
  foreach (var i in collection)
  {
    Console.WriteLine("Compute:" + i);
    yIEld return DoubleInt(i);
  }
}
static int DoubleInt(int i)
{
  Console.WriteLine("The parameter is:" + i);
  return i * 2;
}

// 輸出:// Compute:10
// The parameter is:10
// 20
// Compute:11
// The parameter is:11
// 22
// Compute:12
// The parameter is:12
// 24
// Compute:13
// The parameter is:13
// 26
// Compute:14
// The parameter is:14
// 28

延遲執行的優點是不需要同時加載整個數據源,執行占用資源少、效率高,試想如果數據源非常大,全部加載效率會多低。

當然,某些時候,延遲執行也會導致數據不一致等等,想要關閉延遲執行,可以用ToList<T>()、ToArray<T>()等方法立即執行查詢操作。

前面介紹的集合操作時會影響延遲操作,因此在執行集合操作時應特別注意。

下面的例子演示立即執行。

static void Main()
{
  int[] collection = { 10, 11, 12, 13, 14 };
  Console.WriteLine("Begin query collection:" + DateTime.Now);
  var result = from i in collection
         select DoubleInt(i);
  Console.WriteLine("End query collection & Begin output:" + DateTime.Now);
  foreach (var i in result.ToList())
  {
    Console.WriteLine("Result:" + i + " Time:" + DateTime.Now.ToString());
  }
  Console.WriteLine("End output & Begin get collection count:" + DateTime.Now);
  // 集合操作:取元素的數量
  Console.WriteLine("元素數量為:" + result.Count());
  Console.WriteLine("End get collection count:" + DateTime.Now);
}
static int DoubleInt(int i)
{
  Console.WriteLine("The parameter is:" + i);
  Thread.Sleep(1000);
  return i * 2;
}

// 輸出結果:// Begin query collection:2008-9-12 23:36:34
// End query collection & Begin output:2008-9-12 23:36:34
// The parameter is:10
// The parameter is:11
// The parameter is:12
// The parameter is:13
// The parameter is:14
// Result:20 Time:2008-9-12 23:36:39
// Result:22 Time:2008-9-12 23:36:39
// Result:24 Time:2008-9-12 23:36:39
// Result:26 Time:2008-9-12 23:36:39
// Result:28 Time:2008-9-12 23:36:39
// End output & Begin get collection count:2008-9-12 23:36:39
// The parameter is:10
// The parameter is:11
// The parameter is:12
// The parameter is:13
// The parameter is:14
// 元素數量為:5
// End get collection count:2008-9-12 23:36:44

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved