c# linq GroupBy 关于列表中列表的值

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().

我只是被困在如何从语言列表中获取各个不同的值。

Ngu*_*ong 8

dotnet fiddle 上的演示

您可以使用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)