2014-12-13 59 views
2

我想創建它擁有多個代理商和他們撥打電話的數量列表重複的記錄和值,並做到了,像這樣:如何聚合使用C#

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#聚合函數(如group by)來總結類似代理的調用次數。我正在嘗試的是:

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

任何人都可以幫助我嗎?感謝任何幫助或建議。如果出現錯誤,請教我如何修復代碼。非常感謝!!

回答

3

您目前正在按照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) 
}); 
0

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

而且,因爲你似乎是投影回相同的形狀,爲什麼不留住和項目的大力投入類,而不是一個新的匿名類?