LINQ - リストの辞書を比較して新規および変更されたオブジェクトを検索する

ここに私の問題があります:

私は同じ構造の2つの辞書を持っています:

Dictionary> Existing
Dictionary> New

Basically what I need to do is to first find any List that is in New but not in Existing based on the key and then find any Object in each List contained in New that does not exist in its corresponding List in Existing or is changed based on a number of properties in Object and, of course, the dictionary key.

私は現在、個々のオブジェクトをループしてチェックすることでこれをやっていますが、LINQを使ってこれを行うより良い方法があるはずです。

うまくいけばそれははっきりしていますが、あなたにさらなる情報が必要ならば教えてください。

ありがとう。

2
あなたのコードを教えてください。
追加された 著者 Magnus,

2 答え

As for new entries in the dictionary and new objects within an entry's List:

List[] addedLists = New.Keys.Except(Existing.Keys)
                                    .Select(key => New[key])
                                    .ToArray();

object[] addedObjects = Existing.Keys.Intersect(New.Keys)
                                     .SelectMany(key => New[key].Except(Existing[key])
                                     .ToArray();

しかし、最後の要件は少し不明です。変更されたオブジェクトをどのように定義しますか?変更のためにどのオブジェクトを比較すべきか?どのオブジェクトも他のオブジェクトと比較すると、異なるものとして定義される可能性があるため、比較のベースとなる類似点(たとえば、 ID プロパティで同じ値を持つオブジェクト)が必要です。

EDIT: As you clarified in your comment how object identity is defined, here's how to find all changed objects (assuming the dictionary's value is a list of Foo that has a properties Name and Type that identify the object and property Value that may change:

var differences = Existing.Keys.Intersect(New.Keys).SelectMany(key =>
    from existingObj in Existing[key]
    join newObj in New[key] on new { existingObj.Name, existingObj.Type } equals
                               new { newObj.Name, newObj.Type }
    where existingObj.Value != newObj.Value
    select new { Key = key, Existing = existingObj, New = newObj });

これにより、差異が見つかった辞書のキー、既存のオブジェクトおよび新しいオブジェクトをそれぞれ含む一連のオブジェクトが生成されます。同一のオブジェクトは結果に含まれません。

3
追加された
@indignatz:それを得ました、上の私の編集を参照してください。
追加された 著者 Allon Guralnek,
はい、オブジェクトの名前、型などのプロパティに基づいて類似点があります。基本的には、特定のプロパティが変更されたかどうかを比較することになります。 name == name && type == type && changedprop!= changedprop
追加された 著者 indignatz,
ありがとうございました。私はlinqについて学ぶことがたくさんあるように見えます。 :)
追加された 著者 indignatz,
Dictionary New = new Dictionary();
Dictionary Existing = new Dictionary();

New.Add("A", 100);
New.Add("B", 200);
New.Add("Y", 300);
New.Add("X", 400);


Existing.Add("A", 1);
Existing.Add("B", 2);
Existing.Add("C", 3);
Existing.Add("D", 4);
Existing.Add("E", 5);
Existing.Add("F", 6);
Existing.Add("G", 7);
Existing.Add("H", 8);

var newStuff = New.Where(n => !Existing.ContainsKey(n.Key)).ToList();
var updatedStuff = Existing.Where(e => New.ContainsKey(e.Key) && e.Value != New.Single(n => n.Key == e.Key).Value);


newStuff.Dump();
updatedStuff.Dump();

//updated and new 
newStuff.AddRange(updatedStuff);
newStuff.Dump();

Linqpadで完了。

0
追加された