大家都知道Linq在运行期间定义查询表达式的时候,查询是不会运行的.而是会在迭代数据的时候才运行.
因此会有下面的情况发生:
代码
//-----------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 ,黄聪 , Ltd .
//-----------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
List<int> list = new List<int> { 1, 2 };
var nums = (from n in list where n < 6 select n);
Console.WriteLine("第一次遍历:");
foreach (var n in nums)
{
Console.WriteLine(n);
}
//添加新数据
list.Add(3);
list.Add(4);
list.Add(5);
Console.WriteLine("第二次遍历:");
foreach (var n in nums)
{
Console.WriteLine(n);
}
}
}
}
运行结果:
这里说明在每次迭代的时候,程序都会重新遍历一次list集合,这样我们就能实时检测出数据源的变化.
但是要注意的是:如果在查询之后调用ToArray(), ToEnumerable(), ToList()等操作的话,
数据源会重新得到一个新的名称,而第二次遍历将只对这个变了名的数据源进行遍历!!!!
示例如下:
代码
//-----------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 ,黄聪 , Ltd .
//-----------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
List<int> list = new List<int> { 1, 2 };
var nums = (from n in list where n < 6 select n).ToList();
Console.WriteLine("第一次遍历:");
foreach (var n in nums)
{
Console.WriteLine(n);
}
//添加新数据
list.Add(3);
list.Add(4);
list.Add(5);
Console.WriteLine("第二次遍历:");
foreach (var n in nums)
{
Console.WriteLine(n);
}
}
}
}
运行结果:
两次程序只有以下一句是不一样的:
第一次:
var nums = (from n in list where n < 6 select n);
第二次:
var nums = (from n in list where n < 6 select n).ToList();
但在结果中可以看出,第两次实验中迭代输出的数都一样,但是数据源的集合list中的值已经改变了~
作者:黄聪
出处:http://www.cnblogs.com/huangcong/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
出处:http://www.cnblogs.com/huangcong/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。