3

クラスに基づいて2つのリストがあります

public class test
{
    public string id { get; set; }
    public Int32 quantity { get; set; }
}

List1 
{"A", 1}
{"B", 2}
{"C", 3}

List2
{"A", 1}
{"B", 4}
{"D", 5}

マージされたリストには、両方のリストのすべてのアイテムを含める必要があり、両方のリストに同じ ID がある場合は、数量を比較して、数量が多い方を選択する必要があります。マージされたリストは

Merged list
{"A", 1}
{"B", 4}
{"C", 3}
{"D", 5}

リスト内の項目の順序は重要ではありません。

このマージを実装する方法。

4

2 に答える 2

9

次のようなものを使用できます。

var query = list1.Concat(list2)
                 .GroupBy(x => x.id)
                 .Select(g => g.OrderByDescending(x => x.quantity).First())
                 .ToList();

それは良くありませんが、うまくいくでしょう。(このアプローチでは、lc. の回答のように test の新しいインスタンスを作成する必要がありません。それがあなたにとって重要かどうかはわかりませんが、いくつかのシナリオでは重要であることがわかります。)

いずれかのリストに ID が複数回出現する場合でも、結果で ID を 1 回だけ返す必要があると想定しています。

または、 MoreLINQMaxByから使用します。

var query = list1.Concat(list2)
                 .GroupBy(x => x.id)
                 .Select(g => g.MaxBy(x => x.quantity))
                 .ToList();
于 2012-07-10T17:20:58.520 に答える
8

「ID」は常に一意である必要があると仮定します。

var list = (from l in List1.Concat(List2)
           group l by l.id into g
           select new test() {id = g.Key, quantity = g.Max(x=>x.quantity)})
           .ToList();
于 2012-07-10T17:19:49.850 に答える