本文主要用来记录、让自己有所了解和提升,以后遗忘时可以查看,关于SelectMany(),这篇文章写得不错,值得一看。

话不多说,先上代码看 Select()

public class Person
{public string Name { get; set; }public string Gender { get; set; }public int Age { get; set; }public List<Phone> Phones { get; set; }
}public class Phone
{public string Country { get; set; }public string City { get; set; }public string Name { get; set; }
}static void Main(string[] args)
{List<Person> PersonLists = new List<Person>(){new Person { Name = "张三",Age = 20,Gender = "男",Phones = new List<Phone> {new Phone { Country = "中国", City = "北京", Name = "小米" },new Phone { Country = "中国",City = "北京",Name = "华为"},new Phone { Country = "中国",City = "北京",Name = "联想"},new Phone { Country = "中国",City = "台北",Name = "魅族"},}},new Person { Name = "松下",Age = 30,Gender = "男",Phones = new List<Phone> {new Phone { Country = "日本",City = "东京",Name = "索尼"},new Phone { Country = "日本",City = "大阪",Name = "夏普"},new Phone { Country = "日本",City = "东京",Name = "松下"},}},new Person { Name = "克里斯",Age = 40,Gender = "男",Phones = new List<Phone> {new Phone { Country = "美国",City = "加州",Name = "苹果"},new Phone { Country = "美国",City = "华盛顿",Name = "三星"},new Phone { Country = "美国",City = "华盛顿",Name = "HTC"}}}};Console.WriteLine("这是该方法的第一种重载:");var firstLists = PersonLists.Select(p => p.Name);foreach (var List in firstLists){Console.WriteLine($"{List}");}Console.WriteLine("这是该方法的第二种重载,就是加了一个索引项参数:");var secondLists = PersonLists.Select((p, q) =>{return (q.ToString() + p.Name);});foreach (var List in secondLists){Console.WriteLine($"{List}");}Console.Read();
}

运行效果如下图所示:

接下来再看SelectMany(),SelectMany()就比较牛逼了,官方解释为将序列的每个元素投影到 IEnumerable<TResult> 并将结果序列合并为一个序列,先看代码和运行效果,代码如下:

public class Person
{public string Name { get; set; }public string Gender { get; set; }public int Age { get; set; }public List<Phone> Phones { get; set; }
}public class Phone
{public string Country { get; set; }public string City { get; set; }public string Name { get; set; }
}static void Main(string[] args)
{List<Person> PersonLists = new List<Person>(){new Person { Name = "张三",Age = 20,Gender = "男",Phones = new List<Phone> {new Phone { Country = "中国", City = "北京", Name = "小米" },new Phone { Country = "中国",City = "北京",Name = "华为"},new Phone { Country = "中国",City = "北京",Name = "联想"},new Phone { Country = "中国",City = "台北",Name = "魅族"},}},new Person { Name = "松下",Age = 30,Gender = "男",Phones = new List<Phone> {new Phone { Country = "日本",City = "东京",Name = "索尼"},new Phone { Country = "日本",City = "大阪",Name = "夏普"},new Phone { Country = "日本",City = "东京",Name = "松下"},}},new Person { Name = "克里斯",Age = 40,Gender = "男",Phones = new List<Phone> {new Phone { Country = "美国",City = "加州",Name = "苹果"},new Phone { Country = "美国",City = "华盛顿",Name = "三星"},new Phone { Country = "美国",City = "华盛顿",Name = "HTC"}}}};var Lists = PersonLists.SelectMany(p => p.Phones);//此方法的第一个重载foreach (var list in Lists){Console.WriteLine($"{list.Country} -- {list.City} --{list.Name}");}Console.Read();
}

selectMany可以将phones元素单独投影成为一个序列:

运行效果如下所示:


SelectMany()的第二种重载是这样的:

public static IEnumerable<TResult> SelectMany<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, int, IEnumerable<TResult>> selector);

保持初始化实体类数据不变,编写第二种重载的代码:

            var Lists = PersonLists.SelectMany((p,i) => {p.Phones.ForEach(q => { q.Country += i.ToString(); });return p.Phones;});foreach (var list in Lists){Console.WriteLine($"{list.Country} -- {list.City} --{list.Name}");}Console.Read();

其实无非是多了一个参数:索引,此索引为PersonLists的索引,上述代码会在Phone元素的Country属性中添加PersonLists的索引,返回类型依旧是,然后输出。运行效果如下图所示:


SelectMany()的第三种重载是这样的:

public static IEnumerable<TResult> SelectMany<TSource, TCollection, TResult>(this IEnumerable<TSource> source, Func<TSource, IEnumerable<TCollection>> collectionSelector, Func<TSource, TCollection, TResult> resultSelector)

看似十分复杂,无非就是返回一个自定义的匿名类,并且可以投影你想要的元素,编写第三种重载的代码:

var Lists = PersonLists.SelectMany(p => p.Phones,(p,q) => new { PersonName = p.Name,PhoneName = q.Name });
foreach (var List in Lists)
{Console.WriteLine($"{List.PersonName} -- {List.PhoneName}");
}
Console.Read();

以上代码的返回类型是这样的:

运行结果如下图所示:

SelectMany()的第四种重载是这样的:

public static IEnumerable<TResult> SelectMany<TSource, TCollection, TResult>(this IEnumerable<TSource> source, Func<TSource, int, IEnumerable<TCollection>> collectionSelector, Func<TSource, TCollection, TResult> resultSelector)

其实就是比第三种又多了一个PersonLists的索引而已,代码如下:

var Lists = PersonLists.SelectMany((p,i) =>
{p.Phones.ForEach(q => { q.Name += i.ToString();});return p.Phones;
},
(p,q) => new { PersonName = p.Name,PhoneName = q.Name });
foreach (var List in Lists)
{Console.WriteLine($"{List.PersonName} -- {List.PhoneName}");
}
Console.Read();

运行结果如下图所示:

C#中IEnumerableT.Select()、SelectMany()的简单使用相关推荐

  1. Python网络编程中的select 和 poll I/O复用的简单使用

    From: http://www.cnblogs.com/coser/archive/2012/01/06/2315216.html 首先列一下,sellect.poll.epoll三者的区别  se ...

  2. 我们大家都知道mysql_10个mysql中select语句的简单用法

    本篇文章主要讲述的是MySQL selec句法的简单分析,我们大家都知道MySQL数据库是我们大家经常使用的数据库,其相关的应用也是备受关注的,那么以下的文章主要是对MySQL SELECT句法的简单 ...

  3. html5下拉列表默认值,element-ui中的select下拉列表设置默认值方法_简单_前端开发者...

    element-ui中的select下拉列表如何设置默认值? 在element-ui的运用中,涉及到了select下拉列表.项目中需要将select的默认值给展示出来 那如何修改呢? 上element ...

  4. SQL Server中读取XML文件的简单做法

    SQL Server 2000使得以XML导出数据变得更加简单,但在SQL Server 2000中导入XML数据并对其进行处理则有些麻烦.本文介绍在SQL Server中读取XML文件的简单做法. ...

  5. mysql存储过程into_MySQL存储过程中使用SELECT …INTO语句为变量赋值

    使用SELECT -INTO语句为变量赋值 在MySQL存储过程中,可以使用SELECT -INTO语句对变量进行赋值,该语句在数据库中进行查询,并将得到的结果赋值给变量.SELECT -INTO语句 ...

  6. mysql 操作表的例子,mysql中库和表的简单操作总结(附示例)

    本篇文章给大家带来的内容是关于mysql中库和表的简单操作总结(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 一. 库的操作 1.创建数据库 创建数据库: create d ...

  7. mysql数据表案例_mysql中库和表的简单操作案例

    mysql中库和表的简单操作案例 发布时间:2020-12-05 09:54:06 来源:亿速云 阅读:71 作者:小新 这篇文章主要介绍mysql中库和表的简单操作案例,文中介绍的非常详细,具有一定 ...

  8. java中osend_Java中OIO与NIO的简单区别

    原标题:Java中OIO与NIO的简单区别 1.OIO中,每个线程只能处理一个channel(同步的,该线程和该channel绑定). 线程发起IO请求,不管内核是否准备好IO操作,从发起请求起,线程 ...

  9. mye连接mysql数据库_MySQL_如何在Java程序中访问mysql数据库中的数据并进行简单的操作,在上篇文章给大家介绍了Myeclip - phpStudy...

    如何在Java程序中访问mysql数据库中的数据并进行简单的操作 在上篇文章给大家介绍了Myeclipse连接mysql数据库的方法,通过本文给大家介绍如何在Java程序中访问mysql数据库中的数据 ...

最新文章

  1. Android 数字签名学习笔记
  2. 广告小程序后端开发(4.导入地区数据,修改adminx,修改models,手动添加模拟数据)...
  3. (转)jQuery插件:Image lazy loader图片延迟加载
  4. php中register_global,PHP安全之register_globals的on和off的区别
  5. linux 系统监控 php,Linux系统资源监控命令简介
  6. 如何利用ZBrush中的DynaMesh创建身体(一)
  7. UI: 自定义 UISegmentedControl
  8. 计算机网络中的语法 语义 时序的概念,网络iso协议及语义语法时序详解
  9. BZOJ.3524.[POI2014]Couriers(主席树)
  10. [李景山php]每天TP5-20161205|Loader.php-3
  11. sql server managerment 给表加说明
  12. 20191111每日一句
  13. isight2019安装教程_DS SIMULIA Suite 2019 (Abaqus/Isight/Fe-safe/Tosca) Win/Linux x64
  14. 关于listview的全选、反选、取消、删除等操作
  15. 百度人脸识别api php demo,百度人脸识别api实现及demo
  16. 【Android -- 技术周刊】第 006 期
  17. 量化金融模型ARCH模型官方例程(中文翻译版)
  18. 127_不同国家的手机号,除去国家代码后,有可能相同吗?
  19. IDEA Diagrams使用实现类图(类关系图、子类、父类)
  20. LTE学习:PHICH

热门文章

  1. Django 博客教程(三):创建应用和编写数据库模型
  2. mybatis对java自定义注解的使用——入门篇
  3. 输出一个数的二进制序列中1的个数(三种方法)
  4. 10大iOS开发者最喜爱的类库
  5. 关于三极管偏置电路的思考
  6. JavaScript定义类的几种方式
  7. 通过避免下列 10 个常见 ASP.NET 缺陷使网站平稳运行(转)
  8. php mysql登陆页面完整代码_求助:PHP实现登陆注册的代码是什么啊(主要是数据库那块)?...
  9. 两年Java工作经验应该会些什么技术
  10. html中函数传递多个值,JavaScript 实战开发经验!函数多参数传参技巧