开放的编程资料库

当前位置:我爱分享网 > C#教程 > 正文

C# LINQ SelectMany

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

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

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

C#LINQSelectMany数组数组

第一个示例是一个使用LINQSelectMany方法的简单程序。

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#LINQSelectManyDistinct

Distinct方法用于获取唯一值。

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#LINQSelectMany字符串列表

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

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

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

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

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

C#LINQSelectMany在记录字段上

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

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执行相同的操作;SelectMany更方便。

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

在本文中,我们介绍了LINQSelectMany方法。

列出所有C#教程。

未经允许不得转载:我爱分享网 » C# LINQ SelectMany

感觉很棒!可以赞赏支持我哟~

赞(0) 打赏