zoukankan      html  css  js  c++  java
  • Linq学习之旅——Linq to Objects之立即执行方法(上篇)

    1,ToArray 方法

    2,ToList 方法

    3,ToDictionary 方法

    4,ToLookup 方法

    5,SequenceEqual 方法

    6,First 方法

    7,FirstOrDefault方法

    8,Last 方法

    9,LastOrDefault 方法

    10,Single 方法

    11,SingleOrDefault 方法

     1,ToArray 方法

    从 IEnumerable<T> 创建一个数组。 

                string[] names = { "郭靖", "李莫愁", "黄蓉", "黄药师" };
    
                var query = from n in names
                            where n.IndexOf("") > -1
                            select n;
    
                //转换成一个数组,这句会导致查询立即执行
                string[] newName = query.ToArray();
                foreach (var s in newName)
                {
                    Console.Write(s + " ");
                }
    
                //输出:黄蓉 黄药师

     2,ToList 方法

    从 IEnumerable<T> 创建一个 List<T> 

                string[] names = { "郭靖", "李莫愁", "黄蓉", "黄药师" };
    
                var query = from n in names
                            where n.IndexOf("") > -1
                            select n;
    
                //转换成一个List<string>,这句会导致查询立即执行
                List<string> lstName = query.ToList();
                foreach (var s in lstName)
                {
                    Console.Write(s + " ");
                }
    
                //输出:黄蓉 黄药师

     3,ToDictionary 方法

      根据指定的键选择器函数,从 IEnumerable<T> 创建一个 Dictionary<TKey, TValue>这个方法有多个重载版本。

    注意:如果选择的Key在转换中出现重复,将会引发异常。

            private class GuestInfo
            {
                public int ID { get; set; }
                public string Name { get; set; }
            }
            private void TestLinq()
            {
                List<GuestInfo> guests = new List<GuestInfo>{
                    new GuestInfo{ID =100,Name="Bill"},
                    new GuestInfo{ID =101,Name="Jeffrey"},
                    new GuestInfo{ID =102,Name="Killy"},
                    new GuestInfo{ID =103,Name="Lucy"}
                };
    
                //以ID为键,创建一个Dictionary<int,GuestInfo>类型的字典
                //注意了:如果key重复,这里要抛出异常
                var dicName = guests.Select(g => g).ToDictionary(g => g.ID);
                foreach (var s in dicName)
                {
                    Console.WriteLine("key={0},value={1}", s.Key, s.Value.Name);
                }
    
                //输出:
                //key=100,value=Bill
                //key=101,value=Jeffrey
                //key=102,value=Killy
                //key=103,value=Lucy
            }

     4,ToLookup 方法

    从 IEnumerable<T> 生成一个泛型 Lookup<TKey, TElement>。这个方法和ToDictionary很相似,只不过Dictionary的key和value是一对一的,而LookUp的key和value是1对多的,类似于分组的概念。

      private void ToLookupDemo()
            {
                //将序列转化成LookUp<Tkey,Telement>的序列
                List<GuestInfo> guests = new List<GuestInfo>{
                    new GuestInfo{ID =100,Name="Bill"},
                    new GuestInfo{ID =101,Name="Beffrey"},
                    new GuestInfo{ID =102,Name="Killy"},
                    new GuestInfo{ID =103,Name="Lucy"}
                };
    
                //将Name的第一个字母作为键,这样前面的两个Bill和Beffrey就会是同一个键
                ILookup<string, GuestInfo> lookup = guests.ToLookup(g => g.Name.Substring(0, 1));
    
                foreach (var k in lookup)
                {
                    Console.WriteLine("Key:" + k.Key);
                    foreach (var v in k)
                    {
                        Console.WriteLine("Name={0}", v.Name);
                    }
                    Console.WriteLine("----------------------------------");
                }
                //输出:
                //Key:B
                //Name=Bill
                //Name=Beffrey
                //----------------------------------
                //Key:K
                //Name=Killy
                //----------------------------------
                //Key:L
                //Name=Lucy
                //----------------------------------
            }

    5,SequenceEqual 方法

    比较两个序列是否相等。可以指定比较器,如果不指定,就使用默认的比较器。

            private class GuestInfo
            {
                public int ID { get; set; }
                public string Name { get; set; }
            }
    
            //自定义比较器
            private class GuestInfoComparer : IEqualityComparer<GuestInfo>
            {
                #region IEqualityComparer<GuestInfo>
    
                public bool Equals(GuestInfo x, GuestInfo y)
                {
                    if (object.ReferenceEquals(x, y)) return true;
    
                    if (object.ReferenceEquals(x, null) || object.ReferenceEquals(y, null)) return false;
    
                    return x.ID == y.ID && x.Name == y.Name;
                }
    
                public int GetHashCode(GuestInfo obj)
                {
                    if (obj == null) return 0;
    
                    int hashName = obj.Name == null ? 0 : obj.Name.GetHashCode();
                    int hashId = obj.ID.GetHashCode();
    
                    return hashName ^ hashId;
                }
    
                #endregion
            }
            private void TestLinq()
            {
                GuestInfo g1 = new GuestInfo { ID = 100, Name = "Bill" };
                GuestInfo g2 = new GuestInfo { ID = 101, Name = "Jeffrey" };
    
                List<GuestInfo> lst1 = new List<GuestInfo> { g1, g2 };
                List<GuestInfo> lst2 = new List<GuestInfo> { g1, g2 };
    
                bool result = lst1.SequenceEqual(lst2);//由于lst1,lst2引用了相同的对象
                Console.WriteLine("result #1 ={0}", result);//所以结果是:true
    
                //改变lst2,但里面的值的内容和lst1完全相同
                lst2 = new List<GuestInfo>{
                    new GuestInfo { ID = 100, Name = "Bill" },
                    new GuestInfo { ID = 101, Name = "Jeffrey" }
                };
    
                result = lst1.SequenceEqual(lst2);//由于lst1,lst2引用了不同的对象
                Console.WriteLine("result #2 ={0}", result);//所以结果是:false
    
                //用自定义比较器,比较两个序列
                //lst1,lst2虽然引用了不同的对象,但比较器会比较他们的值,值相等就认为是相同
                result = lst1.SequenceEqual(lst2, new GuestInfoComparer());
                Console.WriteLine("result #3 ={0}", result);//所以结果是:true
    
                //运行结果:
                //result #1 =True
                //result #2 =False
                //result #3 =True
            }

    6,First 方法

    返回序列中的第一个元素。

    注意:如果序列中不包含元素,会引发异常。

                string[] names = { "郭靖", "李莫愁", "黄蓉", "黄药师" };
    
                var query = from n in names
                            select n;
    
                var first = query.First();
                Console.WriteLine(first);
    
                //输出:郭靖

    7,FirstOrDefault方法

    返回序列中的第一个元素。如果序列为空,返回默认值。

                string[] names = { "郭靖", "李莫愁", "黄蓉", "黄药师" };
    
                var query = from n in names
                            where n.Length == 5
                            select n;
    
                //返回第一个元素或默认值
                var first = query.FirstOrDefault();
                Console.WriteLine(first);
    
                //输出:null

    8,Last 方法

    返回序列的最后一个元素。

    注意:和First一样,没有元素时会抛出异常。

                string[] names = { "郭靖", "李莫愁", "黄蓉", "黄药师" };
    
                var query = from n in names
                            select n;
    
                //返回最后一个元素
                var last = query.Last();
                Console.WriteLine(last);
    
                //输出:黄药师

     9,LastOrDefault 方法

    返回序列的最后一个元素。如果序列为空,返回默认值。 

                string[] names = { "郭靖", "李莫愁", "黄蓉", "黄药师" };
    
                var query = from n in names
                            where n.Length == 5
                            select n;
    
                //返回最后一个元素或默认值
                var last = query.LastOrDefault();
                Console.WriteLine(last);
    
                //输出:null

     10,Single 方法

    返回序列中的单个元素。

    注意:如果序列包含多个元素,则会引发异常。

                string[] names = { "郭靖", "李莫愁", "黄蓉", "黄药师" };
    
                var query = from n in names
                            where n.IndexOf("") > -1 //数组里只有一个姓郭的。
                            select n;
    
                //返回单一元素
                var single = query.Single();
                Console.WriteLine(single);
    
                //输出:郭靖

    11,SingleOrDefault 方法

    返回序列中的单个元素。如果序列为空,则返回默认值。

    注意:如果序列有多个(>1)元素,同样会引发异常。

                string[] names = { "郭靖", "李莫愁", "黄蓉", "黄药师" };
    
                var query = from n in names
                            where n.IndexOf("郭襄") > -1 //数组里没有郭襄。
                            select n;
    
                //返回单一元素或默认元素
                var single = query.SingleOrDefault();
                Console.WriteLine(single);
    
                //输出:null
  • 相关阅读:
    spring cglib final @Transactional
    【转】电商架构
    logback发邮件配置
    @Reference不支持继承
    jmap jstack
    dubbo线程池
    C# 爬虫框架实现 流程_爬虫结构/原理
    C# 爬虫框架实现 流程_各个类开发
    C# 爬虫框架实现 概述
    作用域 作用域链 闭包 思想 JS/C++比较
  • 原文地址:https://www.cnblogs.com/xiashengwang/p/2613948.html
Copyright © 2011-2022 走看看