大家都知道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);
}
}
}
}
// 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);
}
}
}
}
// 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中的值已经改变了~
相关文章