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

本文关键字:记录 求和 何使用 | 更新日期: 2023-09-27 18:34:05

我想创建一个列表,其中包含多个座席以及他们拨打的电话数量,并且这样做:

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 },
};

如您所见,将有冗余的数据行。所以我想使用 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)});

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

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

您当前仅按代理 ID 进行分组。您需要将所需的字段投影为匿名对象,以便它们可以用作所选字段的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)
});

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

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

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