首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

LINQ 學習筆記 (七) 延遲執行與非泛型集合查詢 (三) 立即執行與效能展示

     編輯:關於C語言

延遲執行機制演示

自訂 IEnumerable<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 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 與 The parameter is,證明逐元素延遲計算 */

延遲執行優點

  • 不需一次載入整個資料源,記憶體佔用低、效率高。
  • 資料源變更時,重新列舉即可取得最新結果,無需重建查詢。

關閉延遲執行:立即執行

呼叫 ToList()、ToArray() 等方法強制立即執行查詢:

static void Main()
{
    int[] collection = { 10, 11, 12, 13, 14 };
    Console.WriteLine("Begin query:" + DateTime.Now);
    var result = from i in collection select DoubleInt(i);
    Console.WriteLine("End query & Begin output:" + DateTime.Now);
    foreach (var i in result.ToList())  // 立即執行
    {
        Console.WriteLine("Result:" + i + " Time:" + DateTime.Now);
    }
    Console.WriteLine("End output & Begin Count:" + DateTime.Now);
    Console.WriteLine("Count:" + result.Count());  // 再次執行查詢
    Console.WriteLine("End Count:" + DateTime.Now);
}

static int DoubleInt(int i)
{
    Console.WriteLine("The parameter is:" + i);
    Thread.Sleep(1000);
    return i * 2;
}
/* 輸出顯示:ToList() 瞬間完成所有計算,Count() 再次完整執行查詢 */

注意事項

  • 聚合操作(Count、Sum 等)會觸發立即執行。
  • 延遲執行可能導致資料不一致(若資料源在列舉期間被修改),需評估業務場景決定是否立即執行。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved