我有一个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-fe4a21f1c0f1
和Options ,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>>()
我该怎么做?
答案 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
输出看起来像: