文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>LINQ中的"延迟查询"特性

LINQ中的"延迟查询"特性

时间:2011-02-23  来源:Create Chen

小例子证明"延迟查询"的存在性

int[] intArray = new int[] { 0, 1, 2, 3 };
IEnumerable<int> items = intArray.Select(i => i); //返回i
//输出结果
foreach (int item in items)
    Console.WriteLine(item);
//更改一下intArray中的某个元素, 再进行"输出结果"
intArray[0] = 4;
Console.WriteLine("改变intArray第一个元素值之后的输出结果:");
//再次输出结果
foreach (int item in items)
    Console.WriteLine(item);

        两次输出结果分别为:0, 1, 2, 3 和 4, 1, 2, 3. 由此可见只有在枚举items的时候才会真正的执行查询操作. 如果没有延迟查询, 两次输出的结果应该是相同的.

避免"延迟查询"的方法

        可以使用一个不返回IEnumerable<T>数据类型的转换操作符, 如ToArray, ToList, ToDictionary或ToLookup, 这样查询操作就不会被延迟了. 同样是上面例子的, 通过ToList操作符返回一个List<int>型序列, 就不会产生"延迟查询"的现象:

int[] intArray = new int[] { 0, 1, 2, 3 };
List<int> items = intArray.Select(i => i).ToList(); //加了ToList操作符
//输出结果
foreach (int item in items)
    Console.WriteLine(item);
//更改一下intArray中的某个元素, 再进行"输出结果"
intArray[0] = 4;
Console.WriteLine("改变intArray第一个元素值之后的输出结果:");
//再次输出结果
foreach (int item in items)
    Console.WriteLine(item);

        这样两次输出的结果就都为0, 1, 2, 3了.

"延迟查询"可能导致的错误

        因为有了延迟, 被枚举的时候才会真正的去执行一个查询, 因此如果程序编译通过了但绝对不意味着这个查询就是没事儿的. 比如查询一个字符串数组里面, 每个元素的第3个字符是什么的时候, 如果某个字符串长度<3, 那么在运行的时候就会报错, 而程序在编译的时候是没有问题的.

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载