為了更清楚的演示延遲執行的執行時間,自己實現 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