"Lambda表達(dá)式"屬于一個(gè)匿名函數(shù),是一種針對(duì)C#編程語(yǔ)言高效的類似于函數(shù)式編程的表達(dá)式。采用Lambda簡(jiǎn)化了匿名委托的使用,可以大大減少開(kāi)發(fā)中需要編寫的代碼量。比如針對(duì)一些求和、去重、排序等等可以省去了循環(huán)遍歷的寫法,使得代碼變得更加簡(jiǎn)潔。
1、什么是lambda表達(dá)式
"Lambda表達(dá)式"屬于一個(gè)匿名函數(shù),是一種針對(duì)C#編程語(yǔ)言高效的類似于函數(shù)式編程的表達(dá)式。采用Lambda簡(jiǎn)化了匿名委托的使用,可以大大減少開(kāi)發(fā)中需要編寫的代碼量。比如針對(duì)一些求和、去重、排序等等可以省去了循環(huán)遍歷的寫法,使得代碼變得更加簡(jiǎn)潔。
2、lambda表達(dá)式寫法
訪問(wèn)修飾符 修飾符 返回值類型 方法名(參數(shù)列表) => 表達(dá)式;
public static int Add(int a, int b) => a + b;
3、Lambda的本質(zhì)
Lambda的本質(zhì)就是方法匿名方法。
通過(guò)lambda表達(dá)式可以訪問(wèn)lambda表達(dá)式塊外的變量,這稱為閉包。
int lamValue = 10;
Func<int,int> sum = x => x+lamValue;
當(dāng)外部變量的值變動(dòng)時(shí),也會(huì)影響sum的結(jié)果,不建議這樣寫。
4、lambda內(nèi)部實(shí)現(xiàn)過(guò)程
編譯器會(huì)創(chuàng)建一個(gè)匿名類,它有一個(gè)構(gòu)造函數(shù)來(lái)傳遞外部變量。
public class AnonymousClass{
public int lamValue;
public AnonymousClass(int lamValue){
this.lamValue = lamValue;
}
public int AnonymousMethod(int x) => x+lamValue;
}
5、案例
5.1 新建goods.cs 實(shí)體類
using System;
namespace Study
{
[Serializable]
public class Goods
{
/// <summary>
/// 商品名稱
/// </summary>
public string Name { get; set; }
/// <summary>
/// 商品分類名稱
/// </summary>
public string CategoryName { get; set; }
/// <summary>
/// 商品編碼
/// </summary>
public string Code { get; set; }
/// <summary>
/// 商品單價(jià)
/// </summary>
public double Price { get; set; }
/// <summary>
/// 商品數(shù)量
/// </summary>
public int Count { get; set; }
}
}
5.2、測(cè)試Demo
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Study
{
class Program
{
static void Main(string[] args)
{
var list = new List<Goods>();
list.Add(new Goods
{
Name = "小米12",
CategoryName = "手機(jī)",
Price = 3500.00,
Code = "001",
Count = 10
});
list.Add(new Goods
{
Name = "聯(lián)想T50",
CategoryName = "筆記本",
Price = 8800.00,
Code = "002",
Count = 25
});
list.Add(new Goods
{
Name = "雷柏鍵鼠套裝",
CategoryName = "數(shù)碼",
Price = 688.00,
Code = "003",
Count = 60
});
list.Add(new Goods
{
Name = "華為藍(lán)牙耳機(jī)",
CategoryName = "數(shù)碼",
Price = 998.00,
Code = "004",
Count =7
});
// 篩選分類是數(shù)碼的數(shù)據(jù)
var list1 = list.Where(m => m.CategoryName == "數(shù)碼").ToList();
// 篩選分類是數(shù)碼或者手機(jī)的記錄
var list2 = list.Where(m => m.CategoryName == "數(shù)碼" || m.CategoryName=="手機(jī)").ToList();
// 按照價(jià)格升序排序
var list3 = list.OrderBy(m => m.Price).ToList();
// 按照價(jià)格降序
var list4 = list.OrderByDescending(m => m.Price).ToList();
// 按照分類進(jìn)行分組只展示分類名稱
var list5 = list.GroupBy(m => m.CategoryName).ToList();
// 查詢分類是數(shù)碼的商品的總數(shù)量
var list6 = list.Where(m=>m.CategoryName=="數(shù)碼").Sum(m => m.Count);
// 查詢商品名稱包含機(jī)這個(gè)關(guān)鍵字的平均價(jià)格
var list7 = list.Where(m => m.Name.Contains("機(jī)")).Average(m => m.Price);
// 根據(jù)分類進(jìn)行分組 獲取分類名、總數(shù)量、平均單價(jià)
var list8 = list.GroupBy(m => m.CategoryName).Select(n => new Goods
{
CategoryName=n.FirstOrDefault().CategoryName,
Price=n.Average(s=>s.Price),
Count = n.Sum(s => s.Count)
});
// 獲取當(dāng)前列表的前兩行記錄
var list9 = list.Take(2).ToList();
// 獲取后兩行數(shù)據(jù)
var list10 = list.TakeLast(2).ToList();
// 針對(duì)列表內(nèi)存形式的分頁(yè) 跳過(guò)第一條記錄,往后查詢兩條
var list11 = list.Skip(1).Take(2).ToList();
// 針對(duì)整個(gè)列表所有屬性比對(duì)去重
var list12 = list.Distinct().ToList();
// 根據(jù)分類名稱去重
var list13 = list.Select(m => m.CategoryName).Distinct().ToList();
// 逗號(hào)拼接字符串 針對(duì)數(shù)值類型字段的拼接 獲取前端字符串展示
var json1 = string.Join(',', list.Select(m => m.Code));
// 逗號(hào)加'' 單引號(hào)拼接字符串主要是用來(lái)數(shù)據(jù)庫(kù)字段不為數(shù)值類型的 in 查詢sql拼接
var json2 = string.Join("','", list.Select(m => m.Name));
Console.WriteLine(json1);
Console.WriteLine("逆序之前");
foreach (var item in list)
{
Console.WriteLine(JsonConvert.SerializeObject(item));
}
// list 逆序操作
list.Reverse();
Console.WriteLine("逆序之后");
foreach (var item in list)
{ Console.WriteLine(JsonConvert.SerializeObject(item));
}
Console.WriteLine("Hello World!");
}
}
}