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:pIEnumerable<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}"); } }