2012-09-04 28 views
-4

我有兩個列表,List<Collection> collectionsList<Invoice>發票。兩者都有一個CurrencyID字段和一個Value字段。我需要的是將這兩個列表按貨幣ID分組,並將收集的值減去發票價值。而且這只是在匹配的情況下,否則,無論在哪個列表中都會有不匹配的情況,我會在最終列表中需要它。例如:linq加入兩個具有動態大小的列表

invoices  collections   final 
30 EUR    10 USD   10 EUR 
40 CAN    20 EUR   40 USD  
50 USD    50 JPN   40 CAN 
            50 JPN 
+1

[你嘗試過什麼?](http://mattgemmell.com/2008/12/08/what-have-you-tried/) – Habib

+0

foreach,linq,加入,分組......並且不能正確地做它 – bokkie

回答

2

考慮以下類和列表:

class Collection { public string CurrencyID; public Int32 Value; } 
class Invoice { public string CurrencyID; public Int32 Value; } 

... 

List<Collection> collections = new List<Collection> { 
    new Collection() {CurrencyID="USD", Value=10}, 
    new Collection() {CurrencyID="EUR", Value=20}, 
    new Collection() {CurrencyID="JPN", Value=50} 
}; 

List<Invoice> invoices = new List<Invoice> { 
    new Invoice() {CurrencyID="USD", Value=50}, 
    new Invoice() {CurrencyID="EUR", Value=30}, 
    new Invoice() {CurrencyID="CAN", Value=40} 
}; 

你可以得到你想要做什麼,兩個簡單的查詢,然後使用Union將它們結合起來。

var result1 = (from i in invoices 
       let o = collections.SingleOrDefault(x => x.CurrencyID == i.CurrencyID) 
       select new 
       { 
        CurrencyID = i.CurrencyID, 
        Value = i.Value - (o != null ? o.Value : 0) 
       }).ToList(); 

var result2 = from c in collections 
       where !result1.Any(x => x.CurrencyID == c.CurrencyID) 
       select new 
       { 
       CurrencyID = c.CurrencyID, 
       Value = c.Value 
       }; 

var result = result1.Union(result2).OrderBy (r => r.Value); 

結果

enter image description here

+0

它的工作原理,謝謝 – bokkie