在本文中,我们展示了如何使用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#教程。
