How to aggregate duplicate records and sum value u

2019-07-24 00:38发布

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!!

2条回答
姐就是有狂的资本
2楼-- · 2019-07-24 01:09

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?

查看更多
冷血范
3楼-- · 2019-07-24 01:15

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)
});
查看更多
登录 后发表回答