以下為一個合併學生分數的示例數據,依據主鍵統計各個學生的總分數 拿到這種數據,如果要將數據合併,常規的做法就是通過遍歷實現,代碼簡單也容易理解 不考慮代碼行數為工作績效的情況下,可以通過Linq或擴展方法一行優雅的搞定 通過GroupBy過濾主鍵去掉重覆項,避免ToDictionary時重覆主鍵異常 ...
以下為一個合併學生分數的示例數據,依據主鍵統計各個學生的總分數
IList<Student> students=new List<Student>();
students.Add(new Student() { Id = 3, Score = 99, Name = "語文" });
students.Add(new Student() { Id = 5, Score = 87, Name = "語文" });
students.Add(new Student() { Id = 3, Score = 95, Name = "數學" });
students.Add(new Student() { Id = 3, Score = 97, Name = "外語" });
students.Add(new Student() { Id = 5, Score = 90, Name = "外語" });
students.Add(new Student() { Id = 2, Score = 96, Name = "語文" });
students.Add(new Student() { Id = 5, Score = 88, Name = "數學" });
students.Add(new Student() { Id = 2, Score = 97, Name = "數學" });
拿到這種數據,如果要將數據合併,常規的做法就是通過遍歷實現,代碼簡單也容易理解
Dictionary<int,int> query=new Dictionary<int, int>();
foreach (var element in students) {
if (query.ContainsKey(element.Id)) {
query[element.Id]+=element.Score;
}else{
query.Add(element.Id,element.Score);
}
}
不考慮代碼行數為工作績效的情況下,可以通過Linq或擴展方法一行優雅的搞定
var query=(from s in students
group s by s.Id into ng
select ng).ToDictionary(d=>d.Key,d=>d.Sum(s=>s.Score));
var query=students.GroupBy(g=>g.Id).ToDictionary(d=>d.Key,d=>d.Sum(s=>s.Score));
通過GroupBy過濾主鍵去掉重覆項,避免ToDictionary時重覆主鍵異常,當然上面都是簡單的轉換,下麵可以實現稍微點複雜的去重合併
var query= students.GroupBy(g=>g.Id).Select(s=>new Student{Id=s.Key,Score=s.Sum(n=>n.Score),Name=string.Join(",",s.Select(t=>t.Name))});
當然太複雜的合併其實不推薦純擴展方法來實現,很容易造成語法太過複雜維護成本高,對於複雜的合併還是推薦通過Linq和擴展方法組合自定義函數來實現。