连载,LINQ兵法十四章,7(2of3)

问题描述

下面我们为MyLinq添加第二个有用的方法,SelectMany,这个方法的作用是,选取序列中的每个元素,每个元素转换成一个序列,再把这些选取的序列连起来,得到一个整体的序列作为结果输出。我们用SelectMany来遍历交错数组:staticvoidMain(string[]args){int[][]data=newint[][]{newint[]{1,2,3},newint[]{4,5},newint[]{},newint[]{6,7,8,9},newint[]{10}};varresult=data.SelectMany(x=>x);foreach(intiteminresult)Console.WriteLine(item);}我们希望输出12345678910这是代码框架,请完成:publicstaticIEnumerable<TResult>SelectMany<TInput,TResult>(thisIEnumerable<TInput>data,Func<TInput,IEnumerable<TResult>>selector){在此添加代码}完成的代码应该类似这样:publicstaticIEnumerable<TResult>SelectMany<TInput,TResult>(thisIEnumerable<TInput>data,Func<TInput,IEnumerable<TResult>>selector){foreach(TInputitemindata){foreach(TResultxinselector(item)){yieldreturnx;}}}SelectMany可以用来获取两个集合的笛卡尔积,比如说,我们有这样两个数组:string[]colors={"红","黄","蓝","绿"};string[]goods={"衣服","帽子","鞋子"};我们用一种颜色搭配一种东西,一共有多少种组合方式?我们可以用SelectMany实现:varresult=colors.SelectMany(x=>goods.Select(y=>x+y));foreach(stringiteminresult){Console.WriteLine(item);}程序输出如下:红衣服红帽子红鞋子黄衣服黄帽子黄鞋子蓝衣服蓝帽子蓝鞋子绿衣服绿帽子绿鞋子很多时候,我们都会在SelectMany中包含一个Select操作,因为这种情况如此常用,我们再编写一个重载形式,将SelectMany和Select二合一。publicstaticIEnumerable<TResult>SelectMany<TInput,TCollection,TResult>(thisIEnumerable<TInput>data,Func<TInput,IEnumerable<TCollection>>selector,Func<TInput,TCollection,TResult>resultSelector){returndata.SelectMany(x=>selector(x).Select(y=>resultSelector(x,y)));}那么我们可以将调用进一步简化成:varresult=colors.SelectMany(x=>goods,(x,y)=>x+y);下面我们编写第三个方法,where,它的作用是,过滤输入的序列,去掉不符合条件的,将符合条件的元素组成新的序列输出。publicstaticIEnumerable<T>Where<T>(thisIEnumerable<T>data,Func<T,bool>predicate){foreach(Titemindata)if(predicate(item))yieldreturnitem;}我们来调用下:staticvoidMain(string[]args){varprocessNames=System.Diagnostics.Process.GetProcesses().Where(x=>x.PeakPagedMemorySize64>40000000L).Select(x=>x.ProcessName);foreach(stringprocessNameinprocessNames){Console.WriteLine(processName);}}这段代码可以列出当前计算机上运行的进程中占用的峰值内存大于40MB(大约)的进程。它在我的计算机上运行结果如下:Microsoft.Alm.Shared.Remoting.RemoteContainer.dlliexploresvchostMsMpEngexplorersvchostsvchostdevenvSystemWINWORD桌面、Word、VS开发环境“榜上有名”。你也可以用这段代码看看你的计算机上什么程序消耗了很多内存。我们还是用之前的代码举例:staticvoidMain(string[]args){strings=@"1,张三,522,李四,373,王五,47";string[]data=s.Split(newstring[]{"rn"},StringSplitOptions.None);varpeople=data.Select(x=>newPerson(){ID=int.Parse(x.Split(',')[0]),Name=x.Split(',')[1],Age=int.Parse(x.Split(',')[2])});foreach(Personpinpeople){Console.WriteLine(p.Name);}}这段代码不是将输入的字符串转化为Person对象了么,我们现在想知道的是,王五多少岁,怎么写?varresult=people.Where(x=>x.Name=="王五");foreach(Personpinpeople){Console.WriteLine(p.Name);}注意,Where返回的是一个序列,哪怕只找到一个元素。所以不能这么写:Personresult=people.Where(x=>x.Name=="王五");Console.WriteLine(result.Name);如果我们确定查找的元素只有一个(比如根据Name找人),或者找到很多匹配的,但是我们确实只需要一个结果就可以,这么写比较麻烦。我们封装一个First方法来简化上面的代码吧。publicstaticTFirst<T>(thisIEnumerable<T>data){vare=data.GetEnumerator();e.MoveNext();returne.Current;}还记得MoveNext和Current么?如果不记得了,可以复习下。在这里,我们只取第一个结果,就不用foreach了。于是我们可以这样调用了:Personresult=people.Where(x=>x.Name=="王五").First();Console.WriteLine(result.Name);

解决方案

解决方案二:
谢谢楼主分享
解决方案三:

解决方案四:
谢谢楼主分享!
解决方案五:
谢谢楼主分享
解决方案六:
看到中间,已经崩溃了
解决方案七:
谢谢楼主分享
解决方案八:
该回复于2015-08-31 23:54:38被版主删除
解决方案九:
怎么还不更新啊
解决方案十:
精彩啊令人回味无穷
解决方案十一:
楼主怎么不更新了?
解决方案十二:
lz我小白很多地方没看懂我们用一种颜色搭配一种东西,一共有多少种组合方式?我们可以用SelectMany实现:varresult=colors.SelectMany(x=>goods.Select(y=>x+y));比如这里为啥不能写varresult=colors.Select(x=>goods.Select(y=>x+y));
解决方案十三:
写的很好啊。
解决方案十四:
写的很好,为什么没再更新了啊
解决方案十五:
原来是这样的,受益匪浅啊。期待更新。
解决方案:
mark。。留着慢慢看。。期待继续更新。。
解决方案:
该回复于2015-05-31 23:33:07被版主删除
解决方案:
谢谢楼主分享
解决方案:
谢谢分享!太感谢了!受益匪浅!再次感谢!祝身体健康、万事如意!
解决方案:
感谢楼主分享
解决方案:
正好在查linq学习一下
解决方案:

解决方案:
先MARK一下,以后来看
解决方案:
楼主怎么不更新了
解决方案:
mark坐等更新
解决方案:
这个SelectMany介绍的太棒了!还会有更新么?

时间: 2024-07-30 10:06:22

连载,LINQ兵法十四章,7(2of3)的相关文章

连载,LINQ兵法十四章,1(1of1)

问题描述 第一章从类型到接口先看一个简单的程序:intx=1;objecty=2;Console.WriteLine(x.GetType());Console.WriteLine(y.GetType()); 运行结果:System.Int32System.Int32我们定义了两个变量,x和y,它们都是整数.现在的问题是,intx和objectx这两种定义究竟有什么不同.我们利用VS的智能感知提示来观察下:这是x的这是y的我们发现y只有4个方法,而x有6个.CompareTo和GetTypeCod

连载,LINQ兵法十四章,2(1of1)

问题描述 第二章从函数到委托看这样的程序:intsum=0;for(inti=1;i<=100;i++){sum=sum+i;}Console.WriteLine(sum);sum=0;for(inti=1;i<=1000;i++){sum=sum+i;}Console.WriteLine(sum); 这个程序有一点点呆,很明显程序的前半部分和后半部分拥有类似的结构,只是控制i的循环变量的终值不同.因此我们可以提取出一个函数:staticvoidMain(string[]args){Conso

第十四章 数组[《.net框架程序设计》读书笔记]

.net框架|笔记|程序|设计|数组 第十四章 数组. 内容摘要: 本章讨论了数组的方方面面,对于这种常用类型进行深入研究. 一. 数组简介 三种类型:一维数组.多维数组.交错数组(jagged aray) l 一维数组: Int32[] myIntegers; myIntegers = new Int32[100]; l 多维数组: Int32[,] myIntegers; myIntegers = new Int32[100,100]; l 交错数组:交错数组不受CLS支持 Point[][

python 教程 第十四章、 地址薄作业

第十四章. 地址薄作业 #A Byte of Python #!/usr/bin/env python import cPickle import os #define the contacts file, list global file_contacts global list_contacts file_contacts = 'AddressBook.txt' list_contacts = [] #delete the file try: file_path = os.getcwd()

精通ios开发 第七...-精通iOS开发 第七版 第十四章 书上例子错误

问题描述 精通iOS开发 第七版 第十四章 书上例子错误 精通iOS开发 第7版 十四章 书上例子在Xcode7.2上运行不了!怎么改? 解决方案 在哪里买的书,赶快要求退货吧,噗次 解决方案二: 7.2的语法可能有更新了 你需要修正代码 毕竟书是对应老版本xcode

《CIO故事》连载之二十四 整合之道

基本理顺IT 治理结构之后,老胡的工作重心开始转向公司应用系统的整合.在老胡的多年努力之下,公司的各IT系统都运转良好,而且也并非是"老死不相往来"的信息孤岛.近几年,由于公司业务的持续变革,特别是通过并购实现规模扩张,公司内部的新信息孤岛不断产生,而原有的信息系统"即使不是信息孤岛,但也算得上信息 '半岛'了",老胡这样自嘲道.于是,他开始着眼系统整合. 在这次CIO办公会上,老胡向他的得力干将们布置了任务:"我们不能继续让信息孤岛不断产生.打造统一的应

WF从入门到精通(第十四章):基于状态的工作流

学习完本章,你将掌握: 1.理解状态机的概念以及它怎样被模拟到工作流处理中的 2.创建基于状态的工作流 3.运用初始(initial)和终止(terminal)状态条件 4.使用代码进行状态的切换 在第四章"活动和工作流类型介绍"中,我阐述过你使用WF所能创建的工作流类型,在那里我提到过基于状态的工作流.基于状态的工作流模型被认为是有限自动机(finite state machine).基于状态的工作流在工作流需要和外部事件进行许多交互的场合中大出风头.在事件触发并被工作流处理的时候,

TIJ阅读笔记(第十四章)

笔记 14: 创建窗口与Applet 设计的宗旨是"能轻松完成简单的任务,有办法完成复杂的任务". 本章只介绍Java 2的Swing类库,并且合理假定Swing是Java GUI类库的发展方向. 本章的开头部分会讲,用Swing创建applet与创建应用程序有什么不同,以及怎样创建一个既能当applet在浏览器里运行,又能当普通的应用程序,在命令行下运行程序. Swing类库的体系庞大,而本章的目的也只是想让你从基础开始理解并且熟悉这些概念.如果你有更高的要求,只要肯花精力研究,Sw

第十四章 数据结构的扩张

前言:通常我们会遇到一些问题,采用一些标准的数据结构,如双链表.散列表或二叉查找数时,不能够满足操作要求,需要对这些数据结构进行扩张,添加一些额外的信息使得能够完成新的操作.附加的信息需要对数据结构的某些操作进行调整,这个是非常关键的步骤,决定着数据结构扩张是否能够实现.本章主要讨论了红黑树结构的扩张,介绍了两种扩张方式.第一种方式扩张使得红黑色能够支持动态集合上顺序统计,快速找出集合中第i小的数,或给出某个元素在集合的全序中的排名.第二种方式扩张使得红黑色能够进行区间操作,可以很快地找到集合中