CSharp - Difference Select和SelectMany之间区别是什么?

  显示原文与译文双语对照的内容

我一直在寻找 SelectSelectMany 之间的区别,但我找不到合适的答案。 我需要了解在使用LINQ到SQL时的区别,但我发现的是标准数组示例。

有人可以提供一个linqtosql示例?

时间:

SelectMany返回返回列表列表的查询。 例如


public class PhoneNumber
{
 public string Number { get; set; }
}

public class Person
{
 public IEnumerable<PhoneNumber> PhoneNumbers { 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);

于中的例子,如果我们选择许多就像 have,交叉联接操作相关 SQL 那里需要的叉积


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

选择许多可以用于获取下列设置


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

在设置一个的元素和设置b,请注意,在这里我们采取了所有可能的组合,那可以娜伍希卡在线

下面是一个你可以尝试的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)}

SelectMany() 使你可以其他 Select() 或者循环的方式折叠多维序列。

这里博客文章的详细信息。

enter image description here

var players = db.SoccerTeams.Where( c=> c.Country =="Spain")
.SelectMany( c => c.players);

foreach(var player in players)
{
 Console.WriteLine( player.LastName);
}

  1. Ronaldo
  2. 梅西梅西
  3. Fabregas
  4. Bale
  5. Casillas

SelectMany 有几个重载。 其中之一允许你在遍历层次结构时跟踪父和子对象之间的任何关系。

示例: 假设你有以下结构: League -> Teams -> Player

你可以轻松地返回玩家的平面集合。 但是你可能会丢失对该队员的任何引用。

幸运的是,这种目的有一个重载:


var teamsAndTheirLeagues = 
 from helper in leagues.SelectMany
 ( l => l.Teams
, ( league, team ) => new { league, team } )
 where helper.team.Players.Count> 2 
 && helper.league.Teams.Count <10
 select new 
 { LeagueID = helper.league.ID
, Team = helper.team 
 };

上一个示例取自dan博客的IK:

http://blogs.interknowlogy.com/2008/10/10/use-linqs-selectmany-method-to-flatten-collections/

在it,我查看建议你用一下。

选择是从源元素到结果元素的简单one-to-one投影。 当查询表达式中有多个子句时使用 Select-: 原始序列中的每个元素都用于生成一个新序列。

我理解SelectMany可以像连接快捷方式那样工作。

所以你可以:


var orders = customers
. Where(c => c.CustomerName =="Acme")
. SelectMany(c => c.Orders);

...