如何使用C#聚合重复记录和总和值

时间:2014-12-13 06:41:22

标签: c# linq aggregation

我想创建一个列表,其中包含多个代理和它们所做的调用次数,并且这样做:

public class Agent
{
    public string Agent_ID{ get; set; }
    public string Name { get; set; }
    public int Calls { get; set; }

}

var list = new List<Agent>() // To create a list to hold the data
{ 
    new Agent() { Agent_ID = "TK_J", Name = "James", Calls = 10 },
    new Agent() { Agent_ID = "TK_K", Name = "Kurtis", Calls = 10 },
    new Agent() { Agent_ID = "TK_R", Name = "Rebecca", Calls = 5 },
    new Agent() { Agent_ID = "TK_J", Name = "James", Calls = 10 },
    new Agent() { Agent_ID = "TK_R", Name = "Rebecca", Calls = 5 },
    new Agents(){ Agent_ID = "TK_B", Name = "Bobby", Calls = 10 },
};

正如您所看到的,会有冗余的数据行。所以我想用group by等C#聚合函数来总结类似代理的调用次数。我在尝试的是:

list.GroupBy(i => i.Agent_ID).Select(g => new 
{ 
Agent_ID= g.Key, 
Name = */ How do i bring the name here*/, 
Calls = g.Sum(i => i.Calls)});

任何人都可以帮助我吗?感谢任何帮助或建议。如果出现问题,请教我如何修复代码。非常感谢!!

2 个答案:

答案 0 :(得分:4)

您目前仅按AgentID进行分组。 您需要将您需要的字段作为匿名对象投影,以便它们可以作为IGrouping<annonymous,Agent>选择。 见下文。

list.GroupBy(i => new {i.Agent_ID, i.Name}).Select(g => new 
{ 
Agent_ID= g.Key.Agent_ID, 
Name = g.Key.Name, 
Calls = g.Sum(i => i.Calls)
});

答案 1 :(得分:0)

假设Agent_ID将与代理的Name属性同步,您还可以使用类似First()的聚合来从任何Agent记录中返回该名称。 group,因为每个组中的所有代理都具有相同的名称:

list.GroupBy(i => i.Agent_ID)
.Select(g => new Agent // Strong class
{ 
   Agent_ID= g.Key.Agent_ID,
   Name = g.First().Name,
   Calls = g.Sum(i => i.Calls)
})

另外,既然你似乎投射回相同的形状,为什么不保留并投射到强大的类,而不是一个新的anon类?