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); } } }