【问题标题】:c# linq GroupBy on the values of a List within a Listc# linq GroupBy 对 List 中的 List 的值
【发布时间】:2020-05-27 20:14:38
【问题描述】:

我有一个对象列表,在对象中有一个字符串列表。我想要做的是找出每个字符串值有多少。

因此,要使用团队中的人员使用的语言创建一个简单的示例。

public class PeopleLanguages
{
    public string Name;
    public List<string> Languages;
}

创建测试数据...

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" } });

可视化数据:

 * Rod => English | French | German
 * Jane => English | Spanish | Greek
 * Fredie => French | Arabic | Italian
 * Viktor => English | Krakozhian

我可以通过使用 SelectMany().Distinct() 查找不同的字符串值然后在 foreach 循环中匹配来获得我想要的结果:

foreach (string language in peopleLanguages.SelectMany(p => p.Languages).Distinct())
{
    Console.WriteLine($"{language} = {peopleLanguages.Where(p => p.Languages.Contains(language)).Count()}");
}

输出:

English = 3
French = 2
German = 1
Spanish = 1
Greek = 1
Arabic = 1
Italian = 1
Krakozhian = 1

但必须有更好的方法来使用GroupBy()

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

【问题讨论】:

    标签: c# list linq group-by


    【解决方案1】:

    Demo on 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()}");
    }
    

    输出

    English : 3
    French : 2
    German : 1
    Spanish : 1
    Greek : 1
    Arabic : 1
    Italian : 1
    Krakozhian : 1
    

    【讨论】:

    • 完美的解决方案...知道我必须遗漏一些简单的东西,因为这不是一个不寻常的目标:)
    • 是的,这是我的荣幸。
    猜你喜欢
    • 1970-01-01
    • 2013-05-28
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    相关资源
    最近更新 更多