ZetCode

C# LINQ SelectMany

最后修改于 2023 年 7 月 5 日

在本文中,我们将展示如何使用 LINQ 的 SelectMany 方法将序列扁平化为单个序列。

语言集成查询 (LINQ) 是一种特定领域的语言,用于查询来自各种数据源的数据,包括数组、列表、XML 文件或数据库。

SelectMany 方法将多个序列扁平化为单个序列。

C# LINQ SelectMany 数组的数组

第一个示例是一个简单的程序,它使用 LINQ 的 SelectMany 方法。

Program.cs
int[][] vals = {
    new[] {1, 2, 3},
    new[] {4},
    new[] {5, 6, 6, 2, 7, 8},
};

var res = vals.SelectMany(a => a).OrderBy(e => e);
Console.WriteLine(string.Join(", ", res));

在该程序中,我们有一个数组的数组。使用 SelectMany 方法,我们将二维数组扁平化为一维数组值。这些值也被排序。

$ dotnet run
1, 2, 2, 3, 4, 5, 6, 6, 7, 8

C# LINQ SelectMany Distinct

Distinct 方法用于获取唯一值。

Program.cs
var vals = new List<List<int>> {
    new List<int> {1, 2, 3, 3},
    new List<int> {4},
    new List<int> {5, 6, 6, 7, 7}
};

var res = vals.SelectMany(list => list)
              .Distinct()
              .OrderByDescending(e => e);

Console.WriteLine(string.Join(", ", res));

在该程序中,我们将列表的列表中的所有整数扁平化为单个序列。我们只提取唯一值,并按降序排序。

$ dotnet run
7, 6, 5, 4, 3, 2, 1

C# LINQ SelectMany 字符串列表

在下一个示例中,我们将 SelectMany 方法应用于字符串列表。

Program.cs
var ru_words = new List<string> { "осторожность", "собака", "облако", "чашка" };

var res = ru_words.SelectMany(e => e);
Console.WriteLine(string.Join(",", res));

我们定义一个俄语单词列表。SelectMany 将单词切割成字母,并从中形成一个单一的序列。

$ dotnet run
о,с,т,о,р,о,ж,н,о,с,т,ь,с,о,б,а,к,а,о,б,л,а,к,о,ч,а,ш,к,а

C# LINQ SelectMany 记录字段

下一个示例将 SelectMany 方法应用于记录字段。

Program.cs
var users = new List<User> 
{ 
    new ("John", "Doe", new List<string> { "red", "blue" }),
    new ("Roger", "Roe", new List<string> { "black", "yellow" }),
    new ("Jerry", "Dane", new List<string> { "blue", "orange", "white" }),
    new ("Thomas", "Green", new List<string> { "brown" }),
};

List<string> res = users.SelectMany(e => e.colours).ToList();
Console.WriteLine(string.Join(",", res));


record User(string fname, string lname, List<string> colours);

我们有一个用户列表,他们指定了他们最喜欢的颜色。这些颜色在记录类型中被定义为字符串列表。

List<string> res = users.SelectMany(e => e.colours).ToList();

扁平化操作应用于记录的 colours 字段。

$ dotnet run
red,blue,black,yellow,blue,orange,white,brown

C# LINQ Select

我们可以使用 Select 执行相同的操作;SelectMany 更方便。

Program.cs
var users = new List<User> 
{ 
    new ("John", "Doe", new List<string> { "red", "blue" }),
    new ("Roger", "Roe", new List<string> { "black", "yellow" }),
    new ("Jerry", "Dane", new List<string> { "blue", "orange", "white" }),
    new ("Thomas", "Green", new List<string> { "brown" }),
};

IEnumerable<List<string>> res = users.Select(e => e.colours).ToList();

List<string> colours = new List<string>();

foreach(var cols in res)
{
    foreach (var col in cols)
    {
        colours.Add(col);
    }
}

Console.WriteLine(string.Join(",", colours));

colours.Clear();

foreach (var data in res)
{
    colours.AddRange(data);
}

Console.WriteLine(string.Join(",", colours));


record User(string fname, string lname, List<string> colours);

在该示例中,我们将所有喜欢的颜色扁平化为一个字符串列表。

foreach(var cols in res)
{
    foreach (var col in cols)
    {
        colours.Add(col);
    }
}

在第一种情况下,我们使用两个 foreach 循环。

foreach (var data in res)
{
    colours.AddRange(data);
}

在第二种情况下,我们使用一个 foreach 循环和 AddRange 方法。

$ dotnet run
red,blue,black,yellow,blue,orange,white,brown
red,blue,black,yellow,blue,orange,white,brown

来源

Enumerable.SelectMany 方法

在本文中,我们介绍了 LINQ 的 SelectMany 方法。

作者

我的名字是 Jan Bodnar,我是一位充满热情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 到目前为止,我已经撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 C# 教程