NET问答:Select 和 SelectMany 的区别

咨询区

  • Tarik

我已经 google 搜索了 SelectSelectMany 之间的区别,但我并没有找到合适的答案,我现在急切的需要知道在 Linq to SQL 时两者的区别而不是给我用Array展示...

能否有人帮忙提供 Linq To SQL 的例子吗?

回答区

  • Mike Two

SelectMany 它是对 列表中的列表 进行扁平化查询,比如下面的例子。


public class PhoneNumber
{public string Number { get; set; }
}public class Person
{public IEnumerable<PhoneNumber> PhoneNumbers { get; set; }public string Name { get; set; }
}IEnumerable<Person> people = new List<Person>();// Select gets a list of lists of phone numbers
IEnumerable<IEnumerable<PhoneNumber>> phoneLists = people.Select(p => p.PhoneNumbers);// SelectMany flattens it to just a list of phone numbers.
IEnumerable<PhoneNumber> phoneNumbers = people.SelectMany(p => p.PhoneNumbers);// And to include data from the parent in the result: 
// pass an expression to the second parameter (resultSelector) in the overload:
var directory = people.SelectMany(p => p.PhoneNumbers,(parent, child) => new { parent.Name, child.Number });

  • Sriwantha Attanayake

SelectMany 类似 Sql 中的 cross join ,也就是所谓的笛卡尔积,比如下面的例子。


Set A={a,b,c}
Set B={x,y}

SelectMany 之后会得到如下结果。


{ (x,a) , (x,b) , (x,c) , (y,a) , (y,b) , (y,c) }

可以看出,上面就是罗列了 SetA 和 SetB 的所有组合,转换成 linq 的话可以这么写。


List<string> animals = new List<string>() { "cat", "dog", "donkey" };
List<int> number = new List<int>() { 10, 20 };var mix = number.SelectMany(num => animals, (n, a) => new { n, a });

输出结果如下:


{(10,cat), (10,dog), (10,donkey), (20,cat), (20,dog), (20,donkey)}

  • AlejandroR


var players = db.SoccerTeams.Where(c => c.Country == "Spain").SelectMany(c => c.players);foreach(var player in players)
{Console.WriteLine(player.LastName);
}
  1. De Gea

  2. Alba

  3. Costa

  4. Villa

  5. Busquets

点评区

很多时候,我发现越解释概念越说不清楚,最后说着说着就把 理科 变成了 文科,把逻辑变成了硬记????????????,我觉得这时候啥也不要说,直接看源码反而让人更清楚是咋回事。。。

  • Select 的底层逻辑


// System.Linq.Enumerable
using System.Collections.Generic;private static IEnumerable<TResult> SelectIterator<TSource, TResult>(IEnumerable<TSource> source, Func<TSource, int, TResult> selector)
{int index = -1;foreach (TSource item in source){index = checked(index + 1);yield return selector(item, index);}
}
  • SelectMany 的底层逻辑


// System.Linq.Enumerable
using System.Collections.Generic;private static IEnumerable<TResult> SelectManyIterator<TSource, TCollection, TResult>(IEnumerable<TSource> source, Func<TSource, IEnumerable<TCollection>> collectionSelector, Func<TSource, TCollection, TResult> resultSelector)
{foreach (TSource element in source){foreach (TCollection item in collectionSelector(element)){yield return resultSelector(element, item);}}
}

不知道你是否 豁然开朗, 不明白的话,快用 ILSpy 去挖掘 Enumerable 吧!

原文链接:https://stackoverflow.com/questions/958949/difference-between-select-and-selectmany

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303828.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最好的FLV视频下载器 维棠 (支持优酷视频下载、土豆视频下载等)

维棠FLV视频下载能帮助你轻松下载国内外大多数FLV视频分享网站的视频内容;并且维棠FLV视频下载具有断点续传功能。 现在国内外出现了很多视频分享网站&#xff0c;每个用户都可以把自己的视频节目和其他人分享。这些网站有大量的在线视频资源&#xff0c;但是由于网络带宽的限…

linux ns3配置环境,Ubuntu下的NS3安装与入门

NS3的开发旨在为网络研究和教育提供开放&#xff0c;可扩展的网络仿真平台。简而言之&#xff0c;NS3提供了分组数据网络如何工作和执行的模型&#xff0c;并为用户提供了进行模拟实验的模拟引擎。使用ns-3的一些原因包括进行更难或不可能用真实系统执行的研究&#xff0c;在高…

龙芯3A5000完成流片 同主频性能追平AMD Zen1

前不久&#xff0c;龙芯3A5000完成流片&#xff0c;该CPU基于龙芯自主定义指令集LoongArch。据小道消息&#xff0c;SPEC06测试定点26分&#xff08;base 2.5Ghz&#xff09;。这个成绩已经达到预期指标&#xff0c;而且经过进一步优化&#xff0c;SPEC06成绩还有进一步优化的…

Funambol DM 安装过程

Funambol DM 安装过程 Funambol安装过程包括了 Java环境安装 ,Mysql安装 ,Jboss安装和 Funambol DM的安装 .一 : Java环境安装 1: Java现在使用的版本是 :jdk-1_5_0-windows-i586.exe . 2: 安装完毕 ,请在 windows系统下设置环境变量 JAVA_HOME{jdk的安装目录 } 如 : J…

熬夜族又一噩耗:“早死”风险更高!

根据美国西北大学范伯格医学院和英国萨里大学最近的一项研究&#xff0c;相比于早睡早起的人&#xff08;百灵鸟一般&#xff09;&#xff0c;晚上不睡、早晨不起&#xff0c;或起床困难的“夜猫子”们&#xff0c;“早死”的风险更高。这项基于英国生物库中将近50万人样本的研…

Linux中append函数的用法,linux C代码 open函数参数:O_APPEND问题求助

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼没有截图&#xff0c;直接上代码吧。原代码是这样的&#xff1a;#include#include#include#include#includeint main(){int fd-1;ssize_t size-1;off_t offset-1;char buf1[]"0124553";char buf2[]"dsfafads";…

iNeuOS工业互联平台,生产过程业务联动控制

1. 概述工业物联网也好、工业互联网也好或是其他生产系统&#xff0c;反向控制始终无法回避。搞工业最直接、最体现效果的两个方面是采集各种数据和生产过程业务控制&#xff0c;所谓大数据预测和分析&#xff0c;那是仁者见仁、智者见智&#xff0c;下一篇文章我们会专业来讨…

t-sql里Linked server跨数据库查询

set ANSI_NULLS ON set QUOTED_IDENTIFIER ONgoALTER procedure [dbo].[updateData] as/*--必须先创建一个LinkedServerEXEC sp_addlinkedserverserverlyg,--被访问的服务器别名 srvproduct,providerSQLOLEDB,datasrclyg --要访问的服务器*/--登录上一步建好的服务器&#x…

linux防火墙开放所有端口命令,linux centos7 防火墙及端口开放相关命令

一、防火墙相关命令1、查看防火墙状态 &#xff1a; systemctl status firewalld.service注&#xff1a;active是绿的running表示防火墙开启2、关闭防火墙 &#xff1a;systemctl stop firewalld.service3、开机禁用防火墙自启命令 &#xff1a;systemctl disable firewalld.se…

如何使用 BenchmarkDotNet 对 C# 代码进行基准测试

BenchmarkDotNet 是一个轻量级&#xff0c;开源的&#xff0c;强大的 .NET 工具包&#xff0c;它可以将你的方法转化为基准并跟踪这些方法&#xff0c;最后对这些方法的性能提供一些测试报告&#xff0c;使用 BenchmarkDotNet 玩 基准测试 是非常容易的。你可以利用 BenchmarkD…

MSSQL 2008 企业管理器打开命令

MSSQL 2008 Server做了一些调整&#xff0c;取数据是按照200或者1000条查看&#xff0c;对权限控制的更加严格&#xff0c;已经去掉可以添加用户的那个存储过程。同时在启动实例时也加强权限的限制&#xff0c;如果没有权限那么将无法打开。 在MSSQL 2008 Server中如果想通过命…

笑说设计模式-小白逃课被点名

简介 工厂模式&#xff08;Factory Pattern&#xff09;是最常用的设计模式之一。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。在工厂模式中&#xff0c;我们在创建对象时不会对客户端暴露创建逻辑&#xff0c;而是通过使用一个共同的接口来…

原来论文排版还有这样的学问

论文的重要加分点除了内容&#xff0c;还有它小天最近经常遇到小伙伴的诉苦&#xff1a;“我的毕业论文提交一次就被导师批评一次&#xff0c;内容不行就算了&#xff0c;格式也有问题&#xff01;改论文改到绝望”“期刊的版式要求不是统一的&#xff0c;为了多投几家&#xf…

红帽linux5安装Oracle 9i enterprise

红帽linux5安装Oracle 9i enterprise 本文转自&#xff1a;http://database.51cto.com/art/201004/194082.htm摘要&#xff1a;如果你在红帽Linux5上安装Oracle 9i enterprise遇到了问题&#xff0c;不防看一看下面的文章&#xff0c;希望能帮你解决有关Oracle9i实际应用的问题…

powerpc-linux-gcc,关于powerpc-linux-uclibc-gcc的使用

做了点东西需要使用linux下ldap库&#xff0c;我装的linux上已经有ldap库&#xff0c;在程序中#include 了。用gcc编译时&#xff1a;gcc filename.c,会报找不到ldap.h文件以及ldap.h文件中相关函数的错误但是使用gcc filename.c -lldap&#xff0c;就能够编译通过了。后来要求…

神经网络告诉我,谁是世界上最「美」的人?

「魔镜魔镜告诉我&#xff0c;谁是世界上最美的女人&#xff1f;」这句伴随童年的话也有现实版哦&#xff5e;神经网络可以预测人脸颜值&#xff0c;这方面也出现了不少研究。今年年初华南理工大学的研究者发布论文&#xff0c;并公开了数据集 SCUT-FBP5500。本文作者 Dima Shu…

开源推荐:.Net Core3.1 + EF Core + LayUI 封装的MVC版后台管理系统

ASP.NET Core是一个由微软创建的&#xff0c;用于构建Web应用程序&#xff0c;API&#xff0c;微服务的Web框架。它使用常见的模式&#xff0c;例如MVC&#xff08;模型-视图-控制器&#xff09;&#xff0c;依赖注入&#xff0c;和一个由中间件构成它基于Apache 2.0许可开放源…

android中文api(85)——HorizontalScrollView

前言 本章内容是android.widget.HorizontalScrollView&#xff0c;译为"横向滚动条"&#xff0c;版本为Android 2.3 r1&#xff0c;翻译来自"Tina"&#xff0c;感谢"Tina"为大家带来精彩的翻译稿 &#xff01;期待你加入Android API 中文的翻译&…

linux 连接wifi wpa2,RHEL等Linux系统使用wpa_supplicant以WPA-PSK/WPA2-PSK连接WIFI

以RHEL6.4为实验对象&#xff1a;1、安装 wpa_supplicant.yum install wpa_supplicant2、编辑 wpa_supplicant 配置文件vim /etc/sysconfig/wpa_supplicant以下格式&#xff1a;# Use the flag "-i" before each of your interfaces, like so:# INTERFACES"-ie…

如何在 C# 中使用只读的 Collections

集合 表示一组可用于获取和存储的对象&#xff0c;在 C# 中提供了两种类型的集合。普通集合泛型集合前者存在于 System.Collections 命名空间下&#xff0c;属类型不安全的&#xff0c;后者存在于 System.Collections.Generic 命名空间下&#xff0c;属类型安全的。不可变对象 …