LINQ

1..net3.5引入LINQ

2.隐式类型本地变量

var myId = 1; 

var  myName = "aaaaa";

许多LINQ查询返回的序列只有在编译时才能确定其数据类型,显然无法显示的声明变量,此时使用隐式类型。

3.C#LINQ查询操作符是调用System.Linq.Enumerable类中方法的简便方式。这些方法通常都会使用委托作为参数。实际上也就是在使用微软已经定义的大量扩展方法。

4.LINQ经常使用匿名类型在运行时投影新的数据形式。

5.LINQ查询表达式是强类型的。

6.LINQ查询

public void Func1()
        {
            string[] arrStr = { "aaaa", "bbbb", "ccacc", "d ddd" };
            var result = from g in arrStr
                         where g.Contains("a")
                         orderby g
                         select g;

            foreach (var item in result)
            {
                Console.WriteLine(item);
            }
        }

7.LINQ和扩展方法

虽然当前示例不需要编写任何扩展方法,但实际上,背后却无缝的使用了他们。LINQ表达式可以用来在实现了泛型的IEnumerable<T>接口的数据容器上做迭代操作。

但是System.Array这个类并没有实现IEnumerable<T>接口,却可以使用LINQ进行查询,这里就使用到了扩展方法;通过静态的System.Linq.Enumerable类类型间接的得到了该类型所需要的功能。

8.LINQ延迟执行

LINQ在我们迭代内容之前,他们不会真正进行运算。可以使用Enumerable类型定义的许多扩展方法如ToArray<T>,ToList<T>,来立即执行LINQ,并获取数据的快照。

9.向外部调用者返回LINQ查询结果,返回值的类型,可以使用恰当的IEnumerable<T>或者IEnumerable类型

public IEnumerable<string> Func2()
        {
            string[] arrStr = { "aaaa", "bbbb", "ccacc", "d ddd" };
            var result = from g in arrStr
                         where g.Contains("a")
                         orderby g
                         select g;
            return result;
        }

10.LINQ查询应用于非泛型集合

LINQ查询操作符是设计用于任何实现了IEnumerable<T>接口的类型的,无论是直接的还是通过扩展方法间接实现的。System.Collections中传统的非泛型容器类,没有相应的这些条件如ArrayList。但是我们可以使用Enumerable.OfType<T>方法来包含在这些非泛型集合里的数据进行迭代操作。当对一个实现了IEnumerable接口的非泛型容器类调用这个成员方法时,只需指定容器项类型,就可以提取一个兼容于Ienumerable<T>的对象。

var myTest = myArrayList.OfType<MyClass8>();  //把ArrayList转换成一个兼容于IEnumerable<T>的类型,这里的myTest就可以进行迭代了。

11.投影新数据类型

var result = from a in listA select new {a.Id,a.Name};

12.维恩图操作

public void Func1()
        {
            List<string> listA = new List<string> { "aaa", "bbb", "ccc" };
            List<string> listB = new List<string> { "aaa", "ddd", "eee" };
            var result1 = (from s in listA select s).
                Except(from m in listB select m); //返回listA中存在listB中不存在的项
            var result2 = (from s in listA select s).
                Intersect(from m in listB select m);//返回listA和listB中都有的项
            var result3 = (from s in listA select s).
                Union(from m in listB select m);  //返回listA和listB中成员,相同只返回一次。
            var result4 = (from s in listA select s).
                Concat(from m in listB select m); //连接两个list,返回所有的项
        }

14.LINQ查询的内部表示

在编译时,将所有的C#LINQ操作符都翻译为Enumerable类中的方法的调用。Enumerable的许多方法的原型都是把委托作为参数(如Func<>)。所以完全可使用原始的委托来建立查询。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值