Lamamda基礎用法

一、創建數據

  • (1)、數據源1
    在這裏插入圖片描述
  • (2)、數據源2
    在這裏插入圖片描述
    二、普通使用方法
  • (1)ALL 和 ANY
bool allChina = products.All(p => p.Region == "中國");//所有項Region都要是中國,結果:False
bool anyChina = products.Any(p => p.Region == "中國");//某一項Region是中國,結果:True
  • (2)聚集
int countIdGreater5 = products.Count(p => p.ID > 5);//ID大於5的記錄數,結果:4
decimal maxPrice = products.Max(p => p.Price);//金額最高,結果:208000
int minId = products.Min(p => p.ID);//編號最小,結果:1
decimal avgPrice = products.Average(p => p.Price);//金額平均值,結果:53538
decimal sumPrice = products.Sum(p => p.Price);//金額總值 結果:481842
  • (3)累加器
Product aggregate1 = products.Aggregate((total, next) =>//累加器,對products中每一個元素執行一次Func
{
    total.Price += next.Price;
    return total;
});
  • (4)SELECT
string[] select1 = products.Select(p => p.Name).ToArray();//選擇單列,可以轉換成數組
var select2 = products.Select(p => new { p.ID, p.Name }).ToDictionary(d => d.ID);//選擇兩列,可以轉換成鍵值對
var selectMore = products.Select(p => new { p.ID, p.Name, p.Price }).ToList();//選擇多列,可以轉換成對象
//鍵值對必須要保證鍵值是唯一的,在鍵值不唯一的情況可以使用ToLookup方法
var lookup = products.ToLookup(l => l.IsFavorite, p => new { p.ID, p.Name, p.Region, p.Price }).ToList();
lookup.ForEach(l =>
{
    Console.WriteLine(l.Key ? "已收藏" : "未收藏");
    l.ToList().ForEach(item => Console.WriteLine("\t{0}\t{1}\t{2}\t{3}", item.ID, item.Name, item.Region, item.Price));
});
  • (5) ORDER BY
var rightOrder = products.OrderBy(p => p.IsFavorite).ThenByDescending(p => p.ID).ToList();//主IsFavorite,次ID
var errorOrder = products.OrderBy(p => p.IsFavorite).OrderByDescending(p => p.ID).ToList();//主ID,次IsFavorite
  • (6) GROUP BY
var group = products.GroupBy(p => p.IsFavorite).Select(g => new { IsFavorite = g.Key, SumPrice = g.Sum(item => item.Price), CountItem = g.Count() }).ToList();
  • (7) WHERE
List<Product> distinct = products.Distinct().ToList();//去掉重複的記錄
List<Product> take = products.Take(3).ToList();//順序取3條記錄
List<Product> takeWhile = products.TakeWhile(p => p.ID <= 4).ToList();//只要不滿足條件了,返回所有當前記錄
List<Product> skip = products.Skip(3).ToList();//順序跳過3條記錄
List<Product> skipWhile = products.SkipWhile(p => p.Price < 100000).ToList();//只要不滿足條件了,返回所有剩餘記錄
List<Product> contains = products.Where(p => p.Name.Contains("紅")).ToList();//包含“紅”的集合
Product first = products.Where(p => p.Name.StartsWith("大")).First();//“大”開頭的第一條記錄 如果無記錄,直接報異常
Product lastDefault = products.Where(p => p.Name.EndsWith("胡")).LastOrDefault();//“胡”結尾的最後一條記錄 如果無記錄,返回默認值(對象返回null)不會報異常
Product single = products.Where(p => p.ID == 1).SingleOrDefault();//取單條記錄,有多條時會報異常
Product elementDefault = products.ElementAtOrDefault(10);//返回第10條記錄 如果沒有第10條記錄,返回默認值(對象返回null)不會報異常
  • (8)默認值
products.DefaultIfEmpty(new Product { ID = 999, Name = "默認產品", Region = "默認地區", Price = 0 });//判斷是否爲空,是返回默認值,否返回products

(三)複雜使用方法

  • (1)JOIN
    //兩表內聯,結果有2條記錄
var joinTable = table1.AsEnumerable().Join(table2.AsEnumerable(),
    left => left["ID"].ToString(),
    right => right["ID"].ToString(),
    (left, right) => new { 
        LeftID = left["ID"].ToString(), 
        RightID = right["ID"].ToString(), 
        LeftName = left["Name"].ToString(), 
        RightName = right["Name"].ToString() }).ToList();
joinTable.ForEach(t => Console.WriteLine("{0}\t{1}\t{2}\t{3}", t.LeftID, t.RightID, t.LeftName, t.RightName));
  • (2)GROUPJOIN
    //以第一個表爲基準,對第二個表進行分組
var groupJoinTable = table1.AsEnumerable().GroupJoin(table2.AsEnumerable(),
    left => left["Description"].ToString(),
    right => right["Description"].ToString(),
    (key, g) => new { 
        Key = key["Description"].ToString(), 
        Count = g.Count(),
        TotalAmount = g.Where(s => decimal.Parse(s["Amount"].ToString()) > 20).Sum(s => decimal.Parse(s["Amount"].ToString()))
    }).ToList();
groupJoinTable.ForEach(t => Console.WriteLine("{0}\t{1}\t{2}", t.Key, t.Count, t.TotalAmount));
  • (3)比較兩個表是否相等
bool isEqual = table1.AsEnumerable().Where(t => t["ID"].ToString() == "1")
    .SequenceEqual(table2.AsEnumerable().Where(t => t["ID"].ToString() == "1"), DataRowComparer.Default);
Console.WriteLine(isEqual);
  • (4)連接兩個表,不去重複,列取公共部分
var concatTable = table1.AsEnumerable().Concat(table2.AsEnumerable()).ToList();
concatTable.ForEach(t => Console.WriteLine("{0}\t{1}\t{2}\t{3}", t["ID"], t["Name"], t["Amount"], t["Description"]));
  • (5)差集、交集、並集
//兩表的差集
var exceptTable = table1.AsEnumerable().Except(table2.AsEnumerable(), DataRowComparer.Default).ToList();
exceptTable.ForEach(t => Console.WriteLine("{0}\t{1}\t{2}\t{3}", t["ID"], t["Name"], t["Amount"], t["Description"]));
//兩表的交集
var intersectTable = table1.AsEnumerable().Intersect(table2.AsEnumerable(), DataRowComparer.Default).ToList();
intersectTable.ForEach(t => Console.WriteLine("{0}\t{1}\t{2}\t{3}", t["ID"], t["Name"], t["Amount"], t["Description"]));
//兩表的並集
var unionTable = table1.AsEnumerable().Union(table2.AsEnumerable(), DataRowComparer.Default).ToList();
unionTable.ForEach(t => Console.WriteLine("{0}\t{1}\t{2}\t{3}", t["ID"], t["Name"], t["Amount"], t["Description"]));

參考地址:https://blog.csdn.net/sjb2mln/article/details/76686832

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