Rob*_*her 7 c# linq group-by list
我有一个对象列表,在对象中有一个字符串列表。我想要做的是找出每个字符串值有多少。
因此,使用团队中人们所说的语言创建一个简单的示例。
public class PeopleLanguages
{
public string Name;
public List<string> Languages;
}
Run Code Online (Sandbox Code Playgroud)
创建测试数据...
List<PeopleLanguages> peopleLanguages = new List<PeopleLanguages>();
peopleLanguages.Add(new PeopleLanguages { Name = "Rod", Languages = new List<string> { "English", "French", "German" } });
peopleLanguages.Add(new PeopleLanguages { Name = "Jane", Languages = new List<string> { "English", "Spanish", "Greek" } });
peopleLanguages.Add(new PeopleLanguages { Name = "Fredie", Languages = new List<string> { "French", "Arabic", "Italian" } });
peopleLanguages.Add(new PeopleLanguages { Name = "Viktor", Languages = new List<string> { "English", "Krakozhian" } });
Run Code Online (Sandbox Code Playgroud)
要可视化数据:
* Rod => English | French | German
* Jane => English | Spanish | Greek
* Fredie => French | Arabic | Italian
* Viktor => English | Krakozhian
Run Code Online (Sandbox Code Playgroud)
我可以通过SelectMany().Distinct()在 foreach 循环中使用then 匹配查找不同的字符串值来获得我想要的结果:
foreach (string language in peopleLanguages.SelectMany(p => p.Languages).Distinct())
{
Console.WriteLine($"{language} = {peopleLanguages.Where(p => p.Languages.Contains(language)).Count()}");
}
Run Code Online (Sandbox Code Playgroud)
输出:
English = 3
French = 2
German = 1
Spanish = 1
Greek = 1
Arabic = 1
Italian = 1
Krakozhian = 1
Run Code Online (Sandbox Code Playgroud)
但是必须有更好的方法来使用GroupBy().
我只是被困在如何从语言列表中获取各个不同的值。
您可以使用SelectMany获取列表语言列表,然后GroupBy按照您的意愿如下
var result = peopleLanguages
.SelectMany(p => p.Languages)
.GroupBy(p => p);
foreach(var item in result)
{
Console.WriteLine($"{item.Key} : {item.Count()}");
}
Run Code Online (Sandbox Code Playgroud)
输出
English : 3
French : 2
German : 1
Spanish : 1
Greek : 1
Arabic : 1
Italian : 1
Krakozhian : 1
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
221 次 |
| 最近记录: |