2015-04-16 41 views
0

我有借記對象集團與求和並加入值LINQ到對象

List<Debit> debits = new List<Debit>() 
{ 
    new Debit { Code = "A001", Length = 100, Qte = 3, Position = "MCD" }, 
    new Debit { Code = "A001", Length = 100, Qte = 2, Position = "MED" }, 
    new Debit { Code = "A001", Length = 200, Qte = 1, Position = "MCG" }, 
    new Debit { Code = "A002", Length = 200, Qte = 1, Position = "MCD" }, 
    new Debit { Code = "A003", Length = 200, Qte = 1, Position = "TBD" } 
}; 

的這個名單,我試圖通過代碼和長度借記組,總結分組行的Qte財產,並加入位置字符串以逗號分隔「,」在名爲sortedDebitDebit的新列表中。

sortedDebit : 
Code = "A001", Length = 100, Qte = 5, Position = "MCD, MED" 
Code = "A001", Length = 200, Qte = 1, Position = "MCG" 
Code = "A002", Length = 200, Qte = 1, Position = "MCD" 
Code = "A003", Length = 200, Qte = 1, Position = "TBD" 

有沒有一種方法使用linq來做到這一點?

回答

4

當然有。您可以將兩個字段的組合分組爲一個新的組合鍵,這是一個簡單的匿名對象。這要求組成新組合鍵的每個字段都可以通過對象引用或者因爲它具有有效的GetHashCodeEquals實現而相等。

var grouped = debits 
    .GroupBy(d => new { Code = d.Code, Length = d.Length }) 
    .Select(g => new Debit() { 
     Code = g.Key.Code, 
     Length = g.Key.Length, 
     Qte = g.Sum(x => x.Qte), 
     Position = string.Join(", ", g.Select(x => x.Position).Distinct()) 
    }); 
+1

我想.GroupBy在幕後使用'GetHashCode'。在某些情況下,你必須重寫。在某些情況下,我將生成一個複合字符串作爲比較器,所以第二行將變成'.GroupBy(d => String.Format(「{0}:{1}」,d.Code,d.Length)) '。 –

+1

@CraigJohnson是的,新的組合鍵必須以某種方式相等。通常這適用於例如參考類型,因爲參考將是平等的。值類型需要有效的'GetHashCode'和'Equals'實現。連接在這裏不是一個選項,因爲我們仍然需要訪問'Code'和'Length'字段。 – Alex

+0

@亞歷克斯感謝您的解決方案,它完美的工作。但最重要的是,感謝您提供的解釋,這有助於我加深對Linq的瞭解。 – Chalumeau