C# 中的 SelectMany
是一个LINQ扩展方法,它用于将多个集合或可迭代对象中的元素合并到一个连续的序列中。以下是 SelectMany
的一些常见应用场景:
-
扁平化嵌套集合: 当你有一个集合,其中每个元素本身也是一个集合(如列表、数组等),并且你想要将这些嵌套集合中的所有元素扁平化为一个单一列表时,可以使用
SelectMany
。var nestedList = new List
- > {
new List
{ 1, 2 }, new List { 3, 4 }, new List { 5, 6 } }; var flattenedList = nestedList.SelectMany(innerList => innerList).ToList(); // 输出: [1, 2, 3, 4, 5, 6] -
连接多个序列: 如果你有多个独立的序列,并且想要将它们连接成一个单一的序列,可以使用
SelectMany
。var sequence1 = new List
{ 1, 2, 3 }; var sequence2 = new List { 4, 5, 6 }; var combinedSequence = sequence1.SelectMany(x => sequence2).ToList(); // 输出: [1, 4, 2, 5, 3, 6] 注意:上面的示例中,
SelectMany
将两个序列中的元素按顺序连接。如果你想保持原始序列的顺序,并且每个源序列中的元素可以重复出现,可以使用Concat
方法代替。 -
将多个源序列的元素转换为指定类型:
SelectMany
还可以与Select
结合使用,以便将多个源序列中的元素转换为指定的类型。var source1 = new List
{ 1, 2, 3 }; var source2 = new List { "a", "b", "c" }; var combined = source1.SelectMany(x => source2.Select(y => new { Value = https://www.yisu.com/ask/x, Text = y })).ToList();"a"}, { Value=https://www.yisu.com/ask/1, Text="b"}, { Value=https://www.yisu.com/ask/1, Text="c"}, { Value=https://www.yisu.com/ask/2, Text="a"}, { Value=https://www.yisu.com/ask/2, Text="b"}, { Value=https://www.yisu.com/ask/2, Text="c"}, { Value=https://www.yisu.com/ask/3, Text="a"}, { Value=https://www.yisu.com/ask/3, Text="b"}, { Value=https://www.yisu.com/ask/3, Text="c"}] -
处理异步操作: 在处理异步操作时,
SelectMany
可以用于将多个异步操作的结果合并到一个单一的异步操作中。var tasks = new List
> { Task.Run(() => 1), Task.Run(() => 2), Task.Run(() => 3) }; var results = await Task.WhenAll(tasks).SelectMany(task => task).ToList(); // 输出: [1, 2, 3] -
将LINQ查询结果转换为其他类型:
SelectMany
还可以用于将LINQ查询的结果转换为其他类型,例如将其转换为字典。var people = new List
{ new Person { Name = "Alice", Age = 30 }, new Person { Name = "Bob", Age = 25 }, new Person { Name = "Charlie", Age = 35 } }; var nameAgeDictionary = people.SelectMany(person => person.Name.Select(name => new { Name = name, Age = person.Age })).ToDictionary(x => x.Name, x => x.Age); // 输出: { "Alice" => 30, "Bob" => 25, "Charlie" => 35 }
这些只是 SelectMany
的一些常见应用场景。实际上,SelectMany
的用途非常灵活,可以根据具体需求进行组合和调整。