定义
LINQ的SelectMany
操作符是将序列的每个元素投影到IEnumerable<T>
并将结果序列合并为一个序列。这意味着SelectMany
操作符组合来自一系列结果的记录,然后将其转换为一个结果。
SelectMany示例一
在看完SelectMany
操作符的定义后,可能你脑子里还是一片空白。不用着急,下面我们以简单的示例来进一步学习SelectMany
投影操作符。
using System;
using System.Collections.Generic;
using System.Linq;
namespace LinqTutorial
{
public class MyProgram
{
static void Main(string[] args)
{
var list = new List<string> { "Csharp", "JavaScript", "Golang" };
var result = list.SelectMany(x => x);
Console.WriteLine(string.Join(",", result));
Console.ReadKey();
}
}
}
以上代码片段中,使用SelectMany
将字符串集合中的每个字符串都分解成字符,然后再将其合并成一个字符集合,得到的最终result
类型为IEnumerable<char>
,如下图:
输出结果为:
SelectMany示例二
以下是一个使用SelectMany
投影操作符操作嵌套集合的示例。示例中,有一个宠物主人的集合petOwners
,每个宠物主人又拥有一个或者多个宠物。现要求从这些集合中找出以字母S
开头的宠物名称及其主人的名字,使用SelectMany
实现代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
namespace LinqTutorial
{
public class MyProgram
{
static void Main(string[] args)
{
PetOwner[] petOwners =
{
new PetOwner { Name="Higa",
Pets = new List<string>{ "Scruffy", "Sam" } },
new PetOwner { Name="Ashkenazi",
Pets = new List<string>{ "Walker", "Sugar" } },
new PetOwner { Name="Price",
Pets = new List<string>{ "Scratches", "Diesel" } },
new PetOwner { Name="Hines",
Pets = new List<string>{ "Dusty" } }
};
var query =
petOwners
.SelectMany(petOwner => petOwner.Pets, (petOwner, petName) => new { petOwner, petName })
.Where(ownerAndPet => ownerAndPet.petName.StartsWith("S"))
.Select(ownerAndPet =>
new
{
Owner = ownerAndPet.petOwner.Name,
Pet = ownerAndPet.petName
}
);
foreach (var obj in query)
{
Console.WriteLine(obj);
}
Console.ReadKey();
}
}
class PetOwner
{
public string Name { get; set; }
public List<string> Pets { get; set; }
}
}
运行结果:
{ Owner = Higa, Pet = Scruffy }
{ Owner = Higa, Pet = Sam }
{ Owner = Ashkenazi, Pet = Sugar }
{ Owner = Price, Pet = Scratches }
发表评论
登录用户才能发表评论, 请 登 录 或者 注册