用逗号分隔的元组计数项目

时间:2019-06-18 18:07:24

标签: c# list linq

我有一个List<Tuple<string, string>>,其数据如下:

var intents = new List<Tuple<string, string>>
{
    new Tuple<string, string>("60b0e926-2f3a-458d-91f7-fe4a21f1c0f1",
        "Options ,Options ,Options ,Options ,Options ,Options ,Options ,Options ," +
        "Options ,Options ,Options ,Options ,Options"),
    new Tuple<string, string>("d463d996-78cc-428e-8a76-e4875e1c8ff4",
        "RescheudleApt ,RescheudleApt ,ConfirmApt ,ConfirmApt ," + 
        "RescheudleApt ,RescheudleApt"),
    new Tuple<string, string>("re80e926-2f3a-458d-91f7-fe4a54f1c0f1", "ConfirmAppt"),
};

所需的输出将如下所示:

60b0e926-2f3a-458d-91f7-fe4a21f1c0f1
Options: 13

d463d996-78cc-428e-8a76-e4875e1c8ff4
RescheudleApt : 3
ConfirmApt: 2

由于这是一个元组,因此将项目分为“项目1”和“项目2”,这意味着60b0e926-2f3a-458d-91f7-fe4a21f1c0f1Options ,Options ,Options ,Options ,Options ,Options ,Options ,Options ,Options ,Options ,Options ,Options ,Options是不同的属性。

我已经做到了这一点:

        foreach (var item in intents)
        {
            var intentList = item.Item2.Split(',')
                .Select(x => x.Trim())
                .Where(x => !string.IsNullOrWhiteSpace(x))
                .ToList().GroupBy(x => x)
                .Select(g => new { Value = g.Key, Count = g.Count() })
                .OrderByDescending(x => x.Count);
        }

仅给我两个属性的输出:

Value : Options
Count : 13

编辑: 意图List<Tuple<string, string>>()

我该怎么做?

2 个答案:

答案 0 :(得分:4)

intents.Select(root => new 
{ 
    Key = root.Item1, 
    Values = root.Item2.Split(',')
        .Select(x => x.Trim())
        .Where(x => !string.IsNullOrWhiteSpace(x))
        .GroupBy(x => x)
        .Select(g => new 
        { 
            Value = g.Key, 
            Count = g.Count() 
        })
        .OrderByDescending(x => x.Count)
})
.ToList()
.ForEach(x => 
{
    Console.WriteLine(x.Key);
    x.Values.ForEach(child => Console.WriteLine($"{child.Key}: {child.Value}"))
});

答案 1 :(得分:1)

执行此操作的另一种方法是将项目选择到dis(gen)中,其中Dictionary<string, Dictionary<string, int>>Key,而Item1另一个字典,其中{{1}中的Value中具有唯一项,而Item2是每个项的计数,而不是使用匿名类型。

请注意,您可以将Keys添加到Values方法中,这使我们可以删除StringSplitOptions.RemoveEmptyEntries的支票,并且无需在执行以下操作之前调用Split .Where(x => !string.IsNullOrWhiteSpace(x))

例如:

.ToList()

现在,我们可以像这样遍历结果:

GroupBy

输出看起来像:

![enter image description here