0

次のようなリストが 2 つあるとします。

      ID | IsChipCollected | IsShirtCollected | IsPackCollected
A     0                 1                  0                 1
      1                 0                  1                 0
      2                 0                  0                 1      


B     0                 0                  1                 0
      1                 0                  0                 1
      2                 1                  1                 1     

基本的に、2 つのリストを比較してマージする必要があります。B で特定のフラグが true に設定されている場合は、A の代わりにそれを選択する必要があります。

単一の列でこれを達成する方法は知っていますが、2列以上のシナリオで頭を悩ませています

  var result = A.Concat(B)
        .GroupBy(x => x.Id)
        .Select(g => g.OrderByDescending(x => x.IsShirtCollected).First())

これについて何か進展があれば、コードサンプルを更新します (現在まだハッキング中です:P)

期待される結果

     ID | IsChipCollected | IsShirtCollected | IsPackCollected
      0                 1                  1                 1
      1                 0                  1                 1
      2                 1                  1                 1      
4

2 に答える 2

4
var result = A.Concat(B)
        .GroupBy(x => x.Id)
        .Select(g => new {//or new <A and B's generic type>, then change the underCode with proper case
             id = g.Key,
             isShipCollected = g.Max(m => m.IsChipCollected),
             isShirtCollected = g.Max(m => m.IsShirtCollected),
             isPackCollected = g.Max(m => m.IsPackCollected)
    });

編集

Servyの(良い)アイデアに従う(1/0をブール値に変更する)

var result = A.Concat(B)
       .GroupBy(x => x.Id)
       .Select(g => new { 
            id = g.Key,
            isShipCollected = g.Any(m => m.IsChipCollected == 1),
            isShirtCollected = g.Any(m => m.IsShirtCollected == 1),
            isPackCollected = g.Any(m => m.IsPackCollected == 1)
        });
于 2012-08-28T14:05:39.097 に答える
1

concat/groupby よりも速い/遅いかどうかはわかりませんが、技術的に実行している操作は であるJoinため、実際にその結合を実行する方が読みやすさの点で理にかなっています。

var query = listA.Join(listB, item => item.ID, item => item.ID,
    (a, b) => new
    {
        ID = a.ID,
        IsChipCollected = a.IsChipCollected | b.IsChipCollected,
        IsShirtCollected = a.IsShirtCollected | b.IsShirtCollected,
        IsPackCollected = a.IsPackCollected | b.IsPackCollected,
    });
于 2012-08-28T14:23:19.960 に答える