C#知識體系(一) --- 常用的LInq 與lambda表達式

LinQ是我們常用的技術之一。因爲我們繞不開的要對數據進行一系列的調整,如 排序、 條件篩選、求和、分組、多表聯接 等等。

lambda則是我們常用的語法糖,配合linq使用天衣無縫,不知不覺就用上了,主要還是看着代碼簡潔,逼格夠高。。。

接下來我們就來看看常用的有哪些

 

先來點基礎數據

  
    //用戶類
   public class User
    {
      [DataMember]
        public int ID { get; set; }
       [DataMember]
        public string Name { get; set; }
       [DataMember]
        public string Address { get; set; }
       [DataMember]
        public string Phone { get; set; }
       [DataMember]
        public string Sex { get; set; }

        [DataMember]
        public int Age { get; set; }
        [DataMember]
        public int SchID { get; set; }
    }
 /// <summary>
    /// 學校類
    /// </summary>
    internal class School {
        public int SchID { get; set; }
        public string SchName { get; set; }
       public School(){}
       public School(int id,string name) 
       {
           SchID = id;
           SchName = name;
       }
    }
    /// <summary>
    /// 公司類
    /// </summary>
    internal class Company {
        public string Name { get; set; }
       public List<User> Users { get; set; }
       public Company() { }
       public Company(string name, List<User> list)
       {
           Name = name;
           Users = list;
       }
    }

接下來初始化點測試數據

   User user1 = new User()
            {
                ID = 111,
                Name = "張一",
                Address = "上海市某某區",
                Phone = "13547878787",
                Age = 30,
                Sex = "",
                SchID=1
            };
            User user2 = new User()
            {
                ID = 112,
                Name = "李小二",
                Address = "上海市某某區",
                Phone = "13547878783",
                Age = 30,
                Sex = "",
                SchID = 1
            };
            User user3 = new User()
            {
                ID = 113,
                Name = "張三",
                Address = "上海市某某區",
                Phone = "13547878784",
                Age = 30,
                Sex = "",
                SchID = 1
            };
            User user4 = new User()
            {
                ID = 114,
                Name = "李四",
                Address = "上海市某某區",
                Phone = "13547878785",
                Age = 30,
                Sex = "",
                SchID = 1
            };
            List<User> userlist = new List<User>(4) { user1, user2, user3, user4 };

List<School> Schlist = new List<School>() {
new School(1,"武漢大學"),new School(2,"華中科技大學"),new School(3,"華中師範大學")
};

統計(求和)Sum


  //求和
            var sum = userlist.Where(a => { return a.ID > 0; }).Sum(a=>a.ID);
            Console.WriteLine(sum);
//另一種寫法
  sum =(from a in userlist where a.ID>0 select a.ID ).Sum();
            Console.WriteLine(sum);

 IEnumerable.Where()方法裏面的參數數委託類型Func<TSource, bool> 前面爲參數 最後面一個爲返回值



求最大最小值 Max Min

 

  //求最大值
            var max = userlist.Max(a => a.ID);
            Console.WriteLine(max);
            //最小值
            var min = userlist.Min(a => a.ID);
            Console.WriteLine(min);

 

 

循環 ForEach

 

  //循環輸出
            userlist.ForEach(a =>
            {
                if (a.Age > 20)
                {
                    Console.WriteLine(a.ID);
                }

            });

 

條件篩選 where

  //篩選
            var user = userlist.Where(a => a.ID == 114).Single();
            //篩選所有男性用戶
            var templist = userlist.Where(a => a.Sex == "").ToList();

排序

 //排序  根據ID逆序
            templist = userlist.OrderByDescending(a => a.ID).ToList();
            //升序
            templist = userlist.OrderBy(a => a.ID).ToList();

分組 ToLookup 和 GroupBy

 //分組
           var lookup = userlist.ToLookup(a => a.Sex);
           foreach (var item in lookup)
           {
               Console.WriteLine(item.Key);
               foreach (var sub in item)
               {
                   Console.WriteLine("\t\t"+sub.Name+" "+sub.Age);
               }
           }
            //另一種
         var dic =  userlist.GroupBy(a => a.Sex);
         foreach (var item in dic)
           {
               Console.WriteLine(item.Key);
               foreach (var sub in item)
               {
                   Console.WriteLine("\t\t" + sub.Name + " " + sub.Age);
               }
           }
           

聯接 (這裏只展示內聯接)Join

  //聯接
         var temp = from usertemp in userlist join sch in Schlist on usertemp.SchID equals sch.SchID 
                    select new { Id = usertemp.ID, Name = usertemp.Name, Age = usertemp.Age,Schname=sch.SchName };

返回的匿名類,也可以指點實體類

類型查找 OfType

    類型查找很少用到 因爲我們都是用的泛型,不過這裏還是列出來看看

 //類型查找
            List<object>objlist =new List<object>(){1,"2",false,"s",new User(){ID=1,Name="xx"}};

            IEnumerable<string> query1 = objlist.OfType<string>();
  
            foreach (string fruit in query1)
            {
                Console.WriteLine(fruit);
            }

可以看到把2個字符串類型給查找出來了

 

查找深層嵌套 SelectMany

  selectMany很少人用也比較少人知道,它可以避免多層嵌套循環 其使用場景還是挺多的,見下代碼

//查找深層嵌套
            //初始化數據
           

            Company ChinaMobile = new Company("中國移動",userlist);
            Company ChinaUnicom = new Company("中國聯通", userlist);
            List<Company> companylist = new List<Company>() { ChinaMobile, ChinaUnicom };
            //找出2個公司所有女性成員
          var selectlist =  companylist.SelectMany(a => a.Users).Where(b => b.Sex == "");
          foreach (var item in selectlist)
          {
              Console.WriteLine(item.Name+":"+item.Sex);
          }

這裏可以看到 給出的數據源都是同一個list集合 然後我們看每個集合中只有一個女性成員

正常情況下要想取得這數據的話 要經過2層嵌套循環

 foreach (Company c in companylist)
          {
           
           foreach (var item in c.Users)
              {
                  if (item.Sex == "") 
                  {
                      Console.WriteLine(item.Name + ":" + item.Sex);
                  }
              }
          }

 

 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章