C# 当中 LINQ 的常规用法(Lambda 方式)

1. IEnuemrable<T>.Select()

Select 方法比较简单,就是在原有序列的基础上,为每个元素建立一个新的输出形式(类型)。

标准用法如下:

public class TestClass { public string Name { get; set; } public int Age { get; set; } } void Main() { var testList = new List<TestClass> { new TestClass{Name = "张三",Age = 18}, new TestClass{Name="李四",Age = 32}, new TestClass{Name="王二",Age = 24} }; var selectResult = testList.Select(student => new { Name = student.Name, NewAge = student.Age + 20 }); foreach (var student in selectResult) { Console.WriteLine($"姓名:{student.Name},新的年龄:{student.NewAge}"); } }

输出结果:

姓名:张三,新的年龄:38 姓名:李四,新的年龄:52 姓名:王二,新的年龄:44

这样 newResult 的结果就是我们所投射出来新序列,同时 IEnumerbale<T>.Select() 也拥有 延迟执行 的特性,只会在我们需要用到的时候才会进行计算。

2. IEnumerable<T>.SelectMany()

SelectMany() 方法的作用则与 Select() 方法不同,SelectMany() 是用于将每个元素的子集合合并为一个新的集合。

标准用法如下:

void Main() { var demoList = new List<Demo>() { new Demo(){Names = new List<string>{"a","b","c","d"}}, new Demo(){Names = new List<string>{"e","f","g","h"}}, new Demo(){Names = new List<string>{"i","j","k","l"}}, new Demo(){Names = new List<string>{"m","n","o","p"}}, }; var selectResult = demoList.Select(item=>item.Names); Console.WriteLine("Select 操作的结果..."); foreach(var selectItem in selectResult) { foreach(var value in selectItem) { Console.WriteLine($"Value:{value}"); } } Console.WriteLine("================================"); Console.WriteLine("SelectMany 操作的结果..."); var selectManyResult = demoList.SelectMany(item=>item.Names); foreach(var selectManyItem in selectManyResult) { Console.WriteLine($"Value:{selectManyItem}"); } } public class Demo { public List<string> Names { get; set; } }

在本例当中这两个方法分别输出的是 IEnumerable<List<string>> 和 IEnumerable<string> ,这里就可以看出来 SelectionMany() 方法将子集合扁平化输出成一个结果集。

输出结果:

Select 操作的结果... Value:a Value:b Value:c Value:d Value:e Value:f Value:g Value:h Value:i Value:j Value:k Value:l Value:m Value:n Value:o Value:p ================================ SelectMany 操作的结果... Value:a Value:b Value:c Value:d Value:e Value:f Value:g Value:h Value:i Value:j Value:k Value:l Value:m Value:n Value:o Value:p

IEnumerable<T>.SelectMany() 还拥有另外一个重载方法,这个新的重载方法多了一个 resultSelector 参数。在这个委托当中,可以传入 TSource 和 TCollection 让我们将主表的数据与从表进行合并。

标准用法如下:

void Main() { Store[] stores = new Store[] { new Store() { Name = "App Store", Products = new string[] {"iPhone 8", "iPhone 8s", "iPhone X"} }, new Store() { Name = "Google Store", Products = new string[] {"Pixel", "Pixel 2"} } }; var result = stores.SelectMany(store => store.Products, (store, product) => new { StoreName = store.Name, ProductName = product }); foreach(var item in result) { Console.WriteLine($"商店名称:{item.StoreName},产品名称:{item.ProductName}"); } } class Store { public string Name { get; set; } public string[] Products { get; set; } }

输出结果:

商店名称:App Store,产品名称:iPhone 8 商店名称:App Store,产品名称:iPhone 8s 商店名称:App Store,产品名称:iPhone X 商店名称:Google Store,产品名称:Pixel 商店名称:Google Store,产品名称:Pixel 2 3. IEnuemrable<T>.Where()

IEnumerable<T>.Where(Func<T,bool>) 主要用于过滤序列当中需要的元素,与 Select() 一样也是拥有 延迟执行 的特性。

标准用法:

void Main() { var integers = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; var result = integers.Where(x => x >= 5); foreach (var @int in result) { Console.WriteLine($"整形数据:{@int}"); } }

输出结果:

整形数据:5 整形数据:6 整形数据:7 整形数据:8 整形数据:9 4. IEnuemrable<T>.OrderBy() 与 IEnuemrable<T>.OrderByDescending()

上述两个方法主要用于针对序列进行排序操作,OrderBy() 方法是升序排列,而 OrderByDescending() 则是降序排列。

标准用法:

void Main() { var integers = new[] { 3, 1, 2, 8, 5, 6, 7, 4, 9 }; var orderByResult = integers.OrderBy(i=>i); Console.WriteLine("升序排列结果."); foreach (var @int in orderByResult) { Console.WriteLine($"整形数据:{@int}"); } Console.WriteLine("降序排列结果."); var orderByDescResult = integers.OrderByDescending(i => i); foreach (var @int in orderByDescResult) { Console.WriteLine($"整形数据:{@int}"); } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpzjdw.html