Select与SelectMany的区别

Select() 和 SelectMany() 的工作都是依据源值生成一个或多个结果值。

Select() 为每个源值生成一个结果值。因此,总体结果是一个与源集合具有相同元素数目的集合。与之相反,SelectMany() 将生成单一总体结果,其中包含来自每个源值的串联子集合。作为参数传递到 SelectMany() 的转换函数必须为每个源值返回一个可枚举值序列。然后,SelectMany() 将串联这些可枚举序列以创建一个大的序列。

string[] text ={ "Albert was here", "Burke slept late", "Connor is happy" };  var tokens = text.Select(s => s.Split(''));foreach (string[] line in tokens)foreach (string token in line)        Console.Write("{0}.", token);string[] text ={ "Albert was here", "Burke slept late", "Connor is happy" };
var tokens = text.SelectMany(s => s.Split(''));  foreach (string token in tokens)    Console.Write("{0}.", token);

下面两个插图演示了这两个方法的操作之间的概念性区别。在每种情况下,假定选择器(转换)函数从每个源值中选择一个由花卉数据组成的数组。

下图描述 Select() 如何返回一个与源集合具有相同元素数目的集合。

下图描述 SelectMany() 如何将中间数组序列串联为一个最终结果值,其中包含每个中间数组中的每个值。

CSDN的例子:

class Bouquet
{public List<string> Flowers { get; set; }
}static void SelectVsSelectMany()
{List<Bouquet> bouquets = new List<Bouquet>() {new Bouquet { Flowers = new List<string> { "sunflower", "daisy", "daffodil", "larkspur" }},new Bouquet{ Flowers = new List<string> { "tulip", "rose", "orchid" }},new Bouquet{ Flowers = new List<string> { "gladiolis", "lily", "snapdragon", "aster", "protea" }},new Bouquet{ Flowers = new List<string> { "larkspur", "lilac", "iris", "dahlia" }}};// *********** Select ***********            IEnumerable<List<string>> query1 = bouquets.Select(bq => bq.Flowers);// ********* SelectMany *********IEnumerable<string> query2 = bouquets.SelectMany(bq => bq.Flowers);Console.WriteLine("Results by using Select():");// Note the extra foreach loop here.foreach (IEnumerable<String> collection in query1)foreach (string item in collection)Console.WriteLine(item);Console.WriteLine("\nResults by using SelectMany():");foreach (string item in query2)Console.WriteLine(item);/* This code produces the following output:Results by using Select():sunflowerdaisydaffodillarkspurtuliproseorchidgladiolislilysnapdragonasterprotealarkspurlilacirisdahliaResults by using SelectMany():sunflowerdaisydaffodillarkspurtuliproseorchidgladiolislilysnapdragonasterprotealarkspurlilacirisdahlia*/}

   Select() 和 SelectMany() 的工作都是依据源值生成一个或多个结果值。 Select() 为每个源值生成一个结果值。 因此,总体结果是一个与源集合具有相同元素数目的集合。 与之相反,SelectMany() 将生成单一总体结果,其中包含来自每个源值的串联子集合。

  SelectMany()生成的是单一的总体结果。请看SelectMany()函数的实现形式:

 public static IEnumerable<TResult> SelectMany<TSource, TResult>(this IEnumerable<TSource> source,                                                                        Func<TSource, IEnumerable<TResult>> selector) {if (source == null) throw Error.ArgumentNull("source");if (selector == null) throw Error.ArgumentNull("selector");return SelectManyIterator<TSource, TResult>(source, selector);}static IEnumerable<TResult> SelectManyIterator<TSource, TResult>(IEnumerable<TSource> source,                                                                        Func<TSource, IEnumerable<TResult>> selector) {foreach (TSource element in source) {foreach (TResult subElement in selector(element)) {yield return subElement;
                }}}

在代码中的红色部分,可以看出SelectMany()的实现过程。在第一个例子中的SelectMany()。

string[] text ={ "Albert was here", "Burke slept late", "Connor is happy" }; 
            var tokens = text.SelectMany(s => s.Split(''));

text.SelectMany(s => s.Split(''));

可以用SelectManyIterator<TSource, TResult>(IEnumerable<TSource> source,Func<TSource, IEnumerable<TResult>> selector)替换,变成 SelectManyIterator(text,s=>s.Splt(' '));而在SelectManyIterator内部的代码相应的变为:

foreach (string element in text) {                            text是string[]数组

foreach (string subElement in s=>s.Split(' ')) {               s.Split(' ')则编程text元素生成的可枚举数组序列,IEnumerable<string>
                                yield return subElement;}}

以上转换可以看下图:

上图中selector是Func<TSource,IEnumerable<TResult>>谓语表达式,相当于委托。示例中委托的又来克看下图。

以上是我对Select()和SelectMany()的理解,如有错误欢迎指正:

参看CSDN的例子。网址:http://msdn.microsoft.com/zh-cn/library/bb546168.aspx#Mtps_DropDownFilterText

博主:itjeff ,网址:http://www.cnblogs.com/itjeff/p/3368627.html

itjeff

itjeff

转载于:https://www.cnblogs.com/zhangyuanbo12358/p/4107882.html

Select()和SelectMany()的区别相关推荐

  1. NET问答:Select 和 SelectMany 的区别

    咨询区 Tarik: 我已经 google 搜索了 Select 和 SelectMany 之间的区别,但我并没有找到合适的答案,我现在急切的需要知道在 Linq to SQL 时两者的区别而不是给我 ...

  2. Windows Phone 7 IEnumerableT.Select和SelectMany的区别

    IEnumerable<T>在Windows Phone 7的程序上很常用,它允许开发人员定义foreach语句功能的实现并支持非泛型方法的简单迭代,下面主要分析一下 IEnumerabl ...

  3. IEnumerable.Select和SelectMany的区别

    例子(一个人可以有多个手机) public class People{public string Name { get; set; }public List<Phone> Phone { ...

  4. Select和SelectMany之间的区别

    我一直在搜索Select和SelectMany之间的区别,但我一直找不到合适的答案. 我需要学习使用LINQ To SQL的区别,但我发现的只是标准数组示例. 有人可以提供LINQ To SQL示例吗 ...

  5. linq里的select和selectmany操作 投影运算

    原文地址:https://msdn.microsoft.com/zh-cn/library/bb546168.aspx#Mtps_DropDownFilterText 投影运算 其他版本 投影是指将对 ...

  6. spark dataframe的select和selectexpr的区别

    对比: spark dataframe的select和selectexpr的区别 select是把要遍历的集合ienumerable逐一遍历,每次返回一个t,合并之后直接返回一个ienumerable ...

  7. select 和epoll模型区别

    1.select 和epoll模型区别 1.1.网络IO模型概述 通常来说,网络IO可以抽象成用户态和内核态之间的数据交换.一次网络数据读取操作(read),可以拆分成两个步骤:1)网卡驱动等待数据准 ...

  8. mysql select count() count(1)_select count()和select count(1)的区别和执行方式讲解

    select count()和select count(1)的区别和执行方式讲解 发布时间:2020-09-06 13:26:14 来源:脚本之家 阅读:227 作者:CODETC 在SQL Serv ...

  9. select count(*) 和 select count(1) 以及 select count(column) 的区别

    考试,目的在于让自己明白,自己天天写的都是垃圾 select count(*) 和 select count(1) 以及 select count(column) 的区别 1.如果表沒有主键, 那么c ...

最新文章

  1. UI设计培训分享:ui的字体怎么正确设置?
  2. Java中的集合类--复习
  3. Beta阶段项目总结
  4. 在内网服务器中获得真正的客户端ip的方法
  5. php mescroll,mescroll下拉刷新和上拉加载js框架
  6. Spring Boot中的测试
  7. NCRE四级网络工程师考题详解----对等计算模型(P2P)
  8. 用GZIP来压缩socket传输的序列化的类
  9. npm工具运行Vue项目
  10. NGINX访问日志和错误日志
  11. 编程时遇到问题的解决方向
  12. matlab 振动,Matlab振动程序-代码作业
  13. 关于Pycharm进行pytorch分布式训练代码
  14. python入门之函数结构第二关_Python入门二:函数
  15. 手机语音通讯测试(Mobile Phone Communication Test)
  16. 组网 三层交换机配置
  17. OpenHarmony hdc_std无反应的解决办法
  18. 泛函分析基础-如何证明l^∞是完备的度量空间
  19. 夜光:Java成神之路(九)擅长的语言
  20. 2计算机电源机,有人说电脑主机电源功率越大越好,2个知识告诉你这观点是片面的...

热门文章

  1. 简易博客编辑器:玩转document.execCommand命令
  2. 荷兰研制出世界最小U盘:长度不到2厘米
  3. 修改本地管理员密码脚本
  4. GCC G++ C C++的区别
  5. ad采样信噪比与噪声_在AD转换中的过采样和噪声形成
  6. L2-007. 家庭房产-PAT团体程序设计天梯赛GPLT
  7. java list 去除 重复值
  8. Python类、模块、包的概念及区别
  9. VirtualBox虚拟机 四种网络接入模式
  10. 【转】字符编码笔记:ASCII、Unicode、UTF-8 和 Base64