-4

2つのリストList<Collection> collectionsList<Invoice>請求書があります。どちらにもCurrencyIDフィールドとValueフィールドがあります。必要なのは、これら2つのリストをcurrencyIDでグループ化し、収集した値から請求書の値を差し引くことです。そして、これは一致する場合のみです。そうでない場合、どのリストに一致しないものがあったとしても、最終的なリストでそれが必要になります。例えば:

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

1 に答える 1

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

2つの簡単なクエリを実行して必要なものを取得し、を使用してそれらを組み合わせることができます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);

結果

ここに画像の説明を入力してください

于 2012-09-04T13:29:07.790 に答える