自訂 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 等)會觸發立即執行。