0

オブジェクトのリストの比較に関する私の研究でこれまでに見つけた解決策は、通常、オブジェクトの新しいリストを生成しました。たとえば、一方のリストには存在するが、もう一方のリストには存在しないアイテムです。私の場合、2つのリストを比較して、キーが一方のリストに存在し、もう一方のリストには存在しないアイテムを見つけ(両方の方法を比較)、両方のリストにあるキーについて、値が同じか異なるかを確認します。

比較されるオブジェクトには、キーを構成する複数のプロパティに加えて、値を構成するプロパティがあり、最後に、比較の結果を説明する列挙型プロパティ({Equal、NotEqual、NoMatch、NotYetCompared}など)があります。したがって、私のオブジェクトは次のようになります。

class MyObject
{
   //Key combination
   string columnA;
   string columnB;
   decimal columnC;

   //The Value
   decimal columnD;

   //Enum for comparison, used for styling the item (value hidden from UI)
   //Alternatively...this could be a string type, holding the enum.ToString()
   MyComparisonEnum result;
}

これらのオブジェクトは2つにまとめられObservableCollection<MyObject>、比較されます。UIにバインドされると、グリッド行はcaomparison結果の列挙型に基づいてスタイル設定されるため、ユーザーは新しいデータセットにあるキーは簡単に確認できますが、古いデータセットにはないキーを簡単に確認できます。その逆も同様です。別の値。両方のリストはUIのデータグリッドに表示され、行は比較結果に基づいてスタイル設定されます。

LINQはこれを効率的に解決するためのツールとして適していますか、それともループを使用してリストをスキャンし、キーが見つかったときにブレークアウトする必要がありますか(このような解決策は当然、手続き型プログラミングのバックグラウンドから得られます)...または他の方法は?

ありがとうございました!

4

1 に答える 1

0

あなたが使用することができExceptますIntersect

var list1 = new List<MyObject>();
var list2 = new List<MyObject>();
// initialization code 
var notIn2 = list1.Except(list2);
var notIn1 = list2.Except(list1);
var both = list1.Intersect(list2);

異なる値(ColumnD)を持つオブジェクトを検索するには、次の(非常に効率的な)Linqクエリを使用できます。

var diffValue = from o1 in list1
                join o2 in list2
                on new { o1.columnA, o1.columnB, o1.columnC } equals new { o2.columnA, o2.columnB, o2.columnC }
                where o1.columnD != o2.columnD
                select new { Object1 = o1, Object2 = o2 };

foreach (var diff in diffValue)
{
    MyObject obj1 = diff.Object1;
    MyObject obj2 = diff.Object2;
    Console.WriteLine("Obj1-Value:{0} Obj2-Value:{1}", obj1.columnD, obj2.columnD);
}

オーバーライドEqualsしてGetHashCode適切に行う場合:

class MyObject
{
    //Key combination
    string columnA;
    string columnB;
    decimal columnC;

    //The Value
    decimal columnD;

    //Enum for comparison, used for styling the item (value hidden from UI)
    //Alternatively...this could be a string type, holding the enum.ToString()
    MyComparisonEnum result;

    public override bool Equals(object obj)
    {
        if (obj == null || !(obj is MyObject)) return false;
        MyObject other = (MyObject)obj;
        return columnA.Equals(other.columnA) && columnB.Equals(other.columnB) && columnC.Equals(other.columnC);
    }

    public override int GetHashCode()
    {
        int hash = 19;
        hash = hash + (columnA ?? "").GetHashCode();
        hash = hash + (columnB ?? "").GetHashCode();
        hash = hash + columnC.GetHashCode();
        return hash;
    }
}
于 2013-01-28T15:10:27.260 に答える