2016-09-08 11 views
0

私は次のフィールドを持つクラスを持っています。2つのリストの要素を比較し、異なる元のリストの別のリストを返します

class StandardizedModel 
    { 
     public string Case{ get; set; } 
     public DateTime? CreatedDateLocal { get; set; } 
     public DateTime? ClosedDateLocal { get; set; } 
     private string _status; 
    } 

私はこのカスタムクラスで2つのリストを作ったとしましょう。

のList1(メインリスト)

LIST2

私は何をしようとしていますが、彼らは、私はリスト1の元StandardizedModelを返す必要が異なっている場合、二つのリスト内の要素を比較しています。

2つのリストは常に同じサイズであり、両方のリストに常に大文字と小文字が存在しますが、日付とステータスは異なる場合があります。

は私がしようとする要素を比較して、リストに追加するLINQのジッパーを使用してみましたが、それは0

List<StandardizedModel> testList = new List<StandardizedModel>(); 

      var test = List1.Zip(List2, (a, b) => 
      { 
       if (a =! b) { testList.Add(a);} 
       return testList; 
      }); 
+1

...これまでのコードを表示できますか? –

+0

"異なっている場合、私はlist1から元のStandardizedModelを返す必要があります。"そして、同じであれば何を返すのですか?リスト1からアイテムを返すだけですか? – itsme86

+0

にいくつかのサンプルコードを追加しました。 – Tbooty

答えて

3

あなたはefficientあるEnumerable.Join使用することができ返します

var changes = from m1 in list1 
       join m2 in list2 on m1.Case equals m2.Case 
       where m1.CreatedDateLocal != m2.CreatedDateLocal 
       || m1.ClosedDateLocal != m2.ClosedDateLocal 
       || m1._status != m2._status 
       select m1; 
List<StandardizedModel> changeList = changes.ToList(); 
+0

これはタスクを達成しますが、他の場所で再利用する必要がない限り、これを行う適切な方法ではありません。 –

+0

これは正しい方法です。もちろん、 'Equals'をオーバーライドしたり、カスタム' IEqualityComparer 'を使うこともできます。しかし、それはこの特別な仕事には必要ではありません。実際、 'Equals'は' Case'のみを比較し、他のプロパティは比較しないようです。それは動作し、読みやすく効率的です。何が間違っている、それは本当にdownvoteの価値があったのですか? –

+0

これが「正しい」場合は、このコードをコピーして貼り付けることなく、後で別の場所で再利用するにはどうすればよいでしょうか?これはDRY(自分自身を繰り返さないでください)のベストプラクティスにどのように固執しますか? –

-1

あなたの最善の選択コード再利用性のためは、オブジェクトの等価実装をオーバーライドして、それらが必要であるかどうかを判断できるようにします。 tは参照によるものです。つまり、同じメモリ位置を指しています。それらが2つの別々のインスタンスである場合は、どちらの場合も決してありません。 (これがあなたのジッパーが機能しない理由です)次にジッパーを使ってリストを作成することができます。

+0

_から離れていると "これがあなたのジッパーが機能しない理由です" _。 'Zip'は2つのシーケンスを各要素のインデックスでリンクするだけなので、間違った方法です。 –

+0

@TimSchmelter set操作の定義Zip is:指定された関数を2つのシーケンスの対​​応する要素に適用し、一連の結果を生成します。これは私の元の声明を正しいものにします。 –

+0

MSDN:_ "最初のシーケンスの各要素を、2番目のシーケンスの同じインデックスを持つ要素にマージします。シーケンスの要素数が同じでない場合は、シーケンスが1に終わるまでシーケンスをマージしますそれらは同じインデックスの2つのシーケンスの要素にアクセスするfor-loopと同じです。それはアイテムが等しいこととは関係ありません。 –

関連する問題