LINQ学习系列-----3.1 查询非泛型集合

Posted 小王子的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LINQ学习系列-----3.1 查询非泛型集合相关的知识,希望对你有一定的参考价值。

 

一.问题起源

     LINQ to object在设计时,是配合IEnumerable<T>接口的泛型集合类型使用的,例如字典、数组、List<T>等,但是对于继承了IEnumerable的非泛型集合如何处理,例如ArrayList。

二.解决办法

     上源码:

            ArrayList mArrayList = new ArrayList() {"222","1dsadsad","12w1212","1212e12esadq" };
            var query = from m in mArrayList.Cast<string>()
                        where m.Length > 3
                        select m;
            foreach (var item in query)
            {
                Console.WriteLine(item.ToString());
            }
            Console.Read();

       Cast操作符是解决此问题的关键。

             public static IEnumerable<T> Cast<T>( this IEnumerable source);

       解析:

              1.从上述代码可以看出,Cast是一个扩展的方法,返回值是IEumerable<T>,Cast的原对象是IEnumerable,针对实现了IEnumerable接口的对象进行扩展。

              2.Cast操作符将源序列中的每个元素转型为某一指定的类型:T

              3.Cast操作符通过一次遍历源序列中的元素来返回一个可被枚举的对象,当其他代码开始遍历Cast操作的返回结果时,Cast操作符同时开始遍历源序列,转换为T类型,依次返回。

三.OfType

       除了Cast操作符之外,我们还可以使用OfType操作符,差别在于OfType操作符只会返回源序列中属于某种特定类型的元素,例如:

               ArrayList中同时包含有Book和Student两种不同的类型的对象时,调用ArrayList.OfType<Book>() 将只会返回Book对象。

 

本文为学习《LINQ实战》总结。

以上是关于LINQ学习系列-----3.1 查询非泛型集合的主要内容,如果未能解决你的问题,请参考以下文章

OfType 的使用

无法在Repository类中创建非泛型LINQ函数

泛型集合与非泛型集合的异同

LINQ

非泛型集合

为什么要使用泛型?泛型和非泛型对比