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