我想创建一个列表,其中包含多个代理和它们所做的调用次数,并且这样做:
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)});
任何人都可以帮助我吗?感谢任何帮助或建议。如果出现问题,请教我如何修复代码。非常感谢!!
答案 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类?