How to aggregate duplicate records and sum value using C#

空扰寡人 提交于 2019-12-10 22:39:55

问题


I want to create a list where it holds several agents and the number of calls they make and did it like so:

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

As you can see there will be redundant lines of data. So I want to use C# aggregation function such as group by to sum up the similar agent's number of calls. What I was trying was:

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

Anyone can help me? Appreciate any help or advice. If there is something wrong teach me how to fix the code. Many thanks!!


回答1:


You are currently grouping by only AgentID. You'll need to project the fields you require as an anonymous object so they can be available as an IGrouping<annonymous,Agent> to the select. See below.

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



回答2:


Assuming that Agent_ID will be synchronized with the Agent's Name property, you can also use an aggregate like First() to return the the name from any Agent record in the group, since all agents in each group will have the same name:

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

Also, since you seem to be projecting back into the same shape, why not retain and project into the strong class, rather than a new anon class?



来源:https://stackoverflow.com/questions/27456281/how-to-aggregate-duplicate-records-and-sum-value-using-c-sharp

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!