2011-07-18 12 views
0

私はクラスの2つのオブジェクトを持っています。異なるフィールドのみを取得する方法

データは、特定のアクション

class A 
{ 
    int id; 
    string text; 
    public int Id 
    { 
     get { return id; } 
    } 
    public string Text 
    { 
     get { return text; } 
    } 
} 

を作ることが異なっている場合、私は、私はそれを参照として他に、各フィールドを比較する必要がある、と:

Dictionary<string, string> list = aObj.different(bObj); 

list.Key - name property 
list.Value - value of the bObj if it is different 
+0

あなたの質問は何ですか?これは本当にあなたがしようとしていることをはっきりさせるものではありません。これまでに何を試しましたか? –

+0

それは十分に妥当と思われます。質問はなんですか? :) – Tridus

+0

彼は単に彼が同じである2つのクラスのプロパティのデータを比較する必要があると思う。少なくとも私はそれらが同じ – griegs

答えて

3
public Dictionary<string, object> GetDifferences(A target) 
{ 
    Dictionary<string, object> differences = new Dictionary<string, object>(); 
    foreach (PropertyInfo pi in typeof(A).GetProperties()) 
    { 
     if (!pi.GetValue(this, null).Equals(pi.GetValue(target, null))) 
      differences.Add(pi.Name, pi.GetValue(target, null)); 
    } 
    return differences; 
} 
+0

+1。実際には@単にデニス、これはかなり良いです。あなたはこれに2番目のクラスを追加したり、比較や書き込み、拡張メソッドを追加する必要がありますが、違いを返すのは素晴らしいです – griegs

+0

@griegs、はいはい素晴らしいです! – Mediator

+0

しかし、ソースオブジェクト、またはターゲット== nullにプロパティ= nullがある場合は例外が発生しますので、必ず検証してください。 –

1

を私はおそらくそのヘルパーを書きますリフレクションを使用して両方のオブジェクトのプロパティを取得し、それらをループし、値1と1を比較します。

This might help you

And this one too

編集

私は両方のあなたのオブジェクトがあまりにも同じインタフェースを実装した場合、それは容易になると思います。

+0

として実現されたオブジェクトです。 – Mediator

+0

2つのセレクタ(Func )を受け取るヘルパーは、ソリューションを簡略化するために使用することができます。少しのパフォーマンス低下はあるものの、再利用可能なままです。 –

+0

ええ、反射を使用すると、少し遅くなります。うまくいけば、@簡単にデニスはこの1000分をする必要はありません:) – griegs

0

これはさまざまな方法で実行できます。最高のものはあなたの属性リストの長さの枯渇です。最も簡単な方法は、最初のリストを反復することです。各アイテムについて、2番目のアイテムを繰り返して、それらが異なるかどうかを調べます。

似たサイズ(+/- 20%)の大きなリスト(> 20)の場合は、2つのリストをソートし、一致するアイテムを識別する方法を繰り返します。

長さの違う大きなリストの場合は、大きなリストを持つ辞書を作成し、小さいものを繰り返して、前の組み込み辞書の一致するアイテムを探します。

1

メイククラスA:IComparableをとのCompareToのためのロジックを定義()

は、その後、あなたがA.CompareToを使用することができます。メリットは、ソートする必要がある場合はリスト<>でこれを使用できることです。

関連する問題