2016-04-18 14 views
0

は、最初のリストはTypeOneの要素が含まれており、第二のリストがTypeTwoの要素が含まれ、あなたがC#で二つのリストを持って考えてみましょう:リスト内の他のリストに存在しない要素を見つける最も効果的な方法は何ですか?その逆もあります。

​​

今、私はドン」最初のリストには(いくつかのプロパティ値を持つ)の要素を見つける必要があります2番目のリストに存在し、同様に、最初のリストに存在しない2番目のリスト内の要素を探したいとします。

foreach (var item in firstList) 
{ 
    if (!secondList.Any(a=> a.baz == item.foo) 
    { 
     // Item is in the first list but not in second list. 
    } 
} 

と再び::(。どちらかのリストで唯一、ゼロまたは1つの出現箇所があります)

私がこれまで試したどのような

はこのように両方のリストを反復するためにある

foreach (var item in secondList) 
{ 
    if (!firstList.Any(a=> a.foo == item.baz) 
    { 
     // Item is in the second list but not in first list. 
    } 
} 

私はほとんど考えていませんこれは私がしたいことをする良い方法です。私は自分のリストを2回反復していて、それぞれのリストに反復するAnyを使います。あまりにも多くの反復。

これを達成する最も効率的な方法は何ですか?

+0

もう少し情報が必要です。エントリが複数回存在する可能性はありますか、それとも他のリストに0回または1回発生しているのでしょうか? – Toxantron

+0

@Toxantron、それはゼロまたは1つの他のリストのoccurencesです。 – Sobhan

答えて

2

私は恐らくこのためのプレビルドの解決策はありません。できるだけ最適化することが最適です。第二にあるすべてのものが唯一のこのインスタンス内のユニークな値が含まれます。この両方のコピーを実行した後、既に

// First we need copies to operate on 
var firstCopy = new List<TypeOne>(firstList); 
var secondCopy = new List<TypeTwo>(secondList); 

// Now we iterate the first list once complete 
foreach (var typeOne in firstList) 
{ 
    var match = secondCopy.FirstOrDefault(s => s.baz == typeOne.foo); 
    if (match == null) 
    { 
     // Item in first but not in second 
    } 
    else 
    { 
     // Match is duplicate and shall be removed from both 
     firstCopy.Remove(typeOne); 
     secondCopy.Remove(match); 
    } 
} 

比較されることになるので、私たちは、最初のリストを反復処理する必要があります。これは反復数の半分に減らすだけでなく、第2のコピーが各マッチで縮小するので、絶えず改善されます。

+1

このメソッドは、私の場合には本当にうまく動作します、ありがとうございます@トクサントロン。 – Sobhan

1

これを使用LINQクエリ。

var result1 = secondList.Where(p2 => !firstList.Any(p1 => p1.foo == p2.baz)); 

    var result2=firstList.Where(p1=> !secondList.Any(p2=> p2.foo == p1.baz); 
+0

'result1'と' result2'を 'foreach'(反復して発見された項目を扱うため)に反復すると、パフォーマンス上の点では、元の方法より効率的ですか? – Sobhan

+3

いいえこれはちょうどあなたの書き換えられたバージョンです。 – Toxantron

関連する問題