定义
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 }
                    
发表评论
登录用户才能发表评论, 请 登 录 或者 注册