2012-09-04 98 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