举个例子(以下代码是在 linqpad 里面执行的, query.Dump 相当于是在 vs2010 里面的 foreach 循环输出的结果值,也就是输出的意思):
var numbers = new List<int>(); numbers.Add (1); numbers.Dump("List集合的值变成了1个"); IEnumerable<int> query = numbers.Select (n => n * 10); // 建立一个linq查询,默认是延时查询 numbers.Add (2); // 给集合添加一个值,但是这个时候 linq 还未执行,因为延迟查询是在他调用的时候才执行的 numbers.Dump("List集合的值变成了2个"); query.Dump ("注意,这个linq查询返回了2个值,而且都是修改过了的值"); numbers.Dump("List集合的值还是不变的,也就是说 Linq查询是不会改变原来的值的");
在使用linq的时候,在语句里面使用 ToList 来进行即时查询
var numbers = new List<int>();
numbers.Add (1);
numbers.Dump("步骤1时的集合值");
IEnumerable<int> query = numbers.Select(n=>n*10).ToList(); // 建立查询语句,注意,这里加多了一个 ToList() 表示立即执行
numbers.Add (2); // 在这里,我们再添加一个进去
numbers.Dump("步骤2的时候的集合值");
//用 linqpad 执行上面的 linq 查询
query.Dump ("linq开始执行!注意:这个时候linq查询就只显示1个值了,而且值还被修改了");
numbers.Dump("最后");
再演示2个 延时查询 和 立即查询的 例子
延时查询
var numbers = new List<int>() { 1, 2 };
IEnumerable<int> query = numbers.Select (n => n * 10); //默认 延时查询,也就是只有它被调用的时候才执行
query.Dump ("查询后会显示2个元素,而且是新的元素");
numbers.Clear();
query.Dump ("查询后显示空, 因为他的原始数据 numbers 被删除了!");
立即查询
var numbers = new List<int>() { 1, 2 }; List<int> timesTen = numbers .Select (n => n * 10) .ToList(); // 立即执行 返回给 List<int> numbers.Clear(); timesTen.Dump ("因为是立即执行,而不是在调用的时候才延时查询,所以 timesTen的值,还是存在的");
再来演示,如果是外面的变量修改了,那么延时查询和即时查询的区别
int[] numbers = { 1, 2 }; int factor = 10; IEnumerable<int> query = numbers.Select (n => n * factor); factor = 20; query.Dump ("注意,2个数字都 乘以 20 ,而不是 乘以 10");
另外有一个问题,是在linqpad里面的演示,好像是错滴,
IEnumerable<char> query = "Not what you might expect"; query = query.Where (c => c != 'a'); query = query.Where (c => c != 'e'); query = query.Where (c => c != 'i'); query = query.Where (c => c != 'o'); query = query.Where (c => c != 'u'); new string (query.ToArray()).Dump ("All vowels are stripped, as you'd expect."); query = "Not what you might expect"; foreach (char vowel in "aeiou") { query = query.Where (c => c != vowel); } new string (query.ToArray()).Dump ("Notice that only the 'u' is stripped!");
演示说,下面的会仅仅只去掉 U 这个字符,但是实际在我在 linqpad 4.0 里面 显示的都是一样的结果,
另外还有一个 在 foreach 里面的 linq 语句,却能够执行为 只会去掉一个 U 字符
IEnumerable<char> query = "Not what you might expect"; IEnumerable<char> vowels = "aeiou"; IEnumerator<char> rator = vowels.GetEnumerator (); char vowel; while (rator.MoveNext()) { vowel = rator.Current; query = query.Where (c => c != vowel); } query.Dump();
明天再来研究一下