2012-02-06 18 views
1

私は以下のクラスを持って行き方: - 私は何をしたい2を比較して、ものを得ることですLINQでの2つのクラスを比較 - 「不一致」

public class DocumentCompare 
{ 
    public string Customer; 
    public string Filename; 
    public string Reference; 
    public DateTime? Date; 

    public override bool Equals(object obj) 
    { 
     if (obj == null) 
      return false; 

     DocumentCompare doc = obj as DocumentCompare; 
     if ((Object)doc == null) 
      return false; 

     return (doc.Customer == Customer) && (doc.Date == Date) && (doc.Filename == Filename) && (doc.Reference == Reference); 
    } 

    public bool Equals(DocumentCompare doc) 
    { 
     if ((object)doc == null) 
      return false; 

     return (doc.Customer == Customer) && (doc.Date == Date) && (doc.Filename == Filename) && (doc.Reference == Reference); 
    } 

    public override int GetHashCode() 
    { 
     return string.Format("{0}_{1}_{2}_{3}",Customer,Filename,Reference,(Date == null ? "" : Date.Value.ToString())).GetHashCode(); 
    } 
} 

私は、このクラスの2つのリストを取得しますが、両方に存在しないしたがって、アイテムがxリストに存在し、yに存在しない場合、このリスト内のアイテムに対してアクションを実行したいと思います。アイテムがyリストに存在するがxに存在しない場合、別のアクションを実行したい。

どうすればよいですか? LINQを使うと思います!

EDIT:パフォーマンス問題の多くではありません - これは一度だけ

答えて

5

を実行しますあなただけのExceptをしたいようですね:

foreach (var newItem in firstList.Except(secondList)) 
{ 
    ... 
} 

余談:

  • だことハッシュコードを生成するための素晴らしい方法ではありません。ここで他の質問を検索してください。 Equals(object)Equals(DocumentCompare)から
  • デリゲートは、あなたが平等に敏感を変更する場合は特に、1あなたは、辞書内のキーとして値を使用しました(
  • 変更可能なタイプは等価比較のために偉大な候補ではない繰り返しのロジックを避けるために、コンポーネントあなたはプロパティはpublicフィールド
  • よりカプセル化のために優れている、それは可変になりたいん場合でも、私はタイプの密封または2かどうかをチェックしますどちらか
  • )、再びキーを見つけることができなくなりますオブジェクトはであり、正確にはと同じタイプです。そうでなければ、asymm etric平等
+0

+1徹底的に同意する3:通常、デフォルトの参照平等のままにするか、または代理キーを導入し、絶対に必要な場合はそれを比較することをお勧めします – MattDavey

+1

ありがとうございます - これは最高の解決策ではないことがわかりますが、 – Chris

0

ここではコードです:

var elementsMissingFromFirstList = firstList.Except(secondList).ToList(); 
var elementsMissingInSecondList = secondList.Except(firstList).ToList(); 

今、あなたはこれらの不足している要素の上にあなたの行動を実行することができます:)

0

次の2つの異なるリストのオブジェクトを比較するために、このメソッドを使用することができます。 exmp:リストとリストxとy = DocumentCompare、

public static bool EqualsObject<T>(this T t1, T t2) where T : class 
     { 
      var p1 = t1.GetType().Fields(); 
      var p2 = t2.GetType().Fields(); 
      for (int j = 0; j < p1.Length; j++) 
      { 
       var x = p1[j].GetValue(t1, null); 
       var y = p2[j].GetValue(t2, null); 
       if (x == null && y == null) 
        continue; 
       if (x != null && y == null) 
        return false; 
       if (x == null) 
        return false; 
       if (!x.Equals(y)) 
       { 
        return false; 
       } 
      } 
      return true; 
     } 

この方法では、これらの2つのリストの違いが示されます。

public static List<T> DifferentObjects<T>(List<T> t, List<T> t2) where T : class 
    { 
     var diff = new List<T>(); 
     if (t != null && t2 != null) 
     { 
      foreach (T t1 in t) 
      { 
       var state = false; 
       foreach (T t3 in t2.Where(t3 => EqualsObject(t1,t3))) 
       { 
        state = true; 
       } 
       if (!state) 
       { 
        diff.Add(t1); 
       } 
      } 
     } 
     return diff; 
    } 

ようにあなたは、コードをあなたがあなたのクラスで(顧客、ファイル名など。)フィールドを使用

 var t = new List<DocumentCompare>(); 
     var t2 = new List<DocumentCompare>(); 

     t.Add(new DocumentCompare{Customer = "x"}); 
     t.Add(new DocumentCompare{Customer = "y"}); 
     t.Add(new DocumentCompare{Customer = "z"}); 

     t2.Add(new DocumentCompare { Customer = "t" }); 
     t2.Add(new DocumentCompare { Customer = "y" }); 
     t2.Add(new DocumentCompare { Customer = "z" }); 

     var list = DifferentObjects(t, t2); 
     var list2 = DifferentObjects(t2, t); 

この方法を使用することができますメソッドGetType()フィールズ(); EqualsObjectメソッドで使用されます。プロパティを使用する場合は、GetType()を使用する必要があります。 EqualsObjectメソッドで宣言します。

関連する問題