2013-05-08 5 views
5

2つのリストを比較して一致を返す最速の最良の方法は何ですか? 一致するのは1つだけです。 List1には、データベースの動的データが含まれています。私は今それを行うリストを比較してCで返信する

方法:

foreach (var item1 in List1) 
{ 
    foreach (var item2 in List2) 
    { 
     if(item2 == item1) 
     string match = item1; 
    } 
} 

は、私はそれがはるかに高速に行うことができるような感じを持っています。

答えて

11

Enumerable.Intersectを使用してください。

var matchItem = List1.Intersect(List2).First(); 

現在のコードの方がどれくらい速いか分かりませんが、ストップウォッチを使って測定できます。しかし、あなたの現在のコードでは、一致を見つける上であなたの内側と外側のループを破る必要があります。次のようなものがあります。

foreach (var item1 in List1) 
{ 
    string match = null; 
    foreach (var item2 in List2) 
    { 
     if (item2 == item1) 
     { 
      match = item1; 
      break; 
     } 
    } 
    if (match != null) 
     break; 
} 
+1

それは – Bernardmoes

+0

@Habibを動作するかどうか、私がチェックする、それが速いか簡潔なのですか?私はそれが内部的に同じループをしているのですか? – tariq

+0

@tariq、はい、それは内部的にループしますが、私はそれが速いかどうかはわかりません、なぜ私は質問から変更されたコードで他のオプションを提供したのですか? – Habib

2

これはさまざまな方法があります。これは主に、一致させようとしているデータに依存します。あなたは端から

  • の初めからあなたのリストを繰り返し処理することができ、リストの中央値を知っているが、ほとんどはちょうどあなたを返す場合はあなたが行うことができます

    • まず最初は、ソートされたリスト
    • を持っていますあなたはそれを

    を見つけたので、あなたのリストには、アイテムを識別するために頼ることができた上で、いくつかの数値を持っている場合は値も最初の2点のみ機能します。

    あなたが行うことができます最初の最適化は、次のとおりです。

    Foreach (var item1 in List1) 
    { 
        Foreach (var item2 in List2) 
        { 
         if(item2 == item1) return item1; 
        } 
    } 
    

    あなたが本当に非常に速く、あなたのリストにあるデータに基づいて最適化を行う必要があるでしょうになるこのルーチンが必要な場合。

    また、両方のリストでデータがstringである場合は、各文字列(string.GetHashCode)にハッシュコードを生成してから、リスト内で並べ替えて検索することができます。

    あり、他の多くの方法がありますが、それはすべてに依存します:

    • あなたは(あなたが唯一の100個の要素を持っている場合は、パフォーマンス向上の多くは表示されません)あなたのリストを持っているデータの量
    • あなたのリストは、彼らはあなたがこれらのリスト
    • で検索を作るのですかどのくらいの頻度ダイナミック
    • ている場合、彼らは変更することができますどのくらいの頻度
    • 静的または動的である場合...
  • 1

    一致するものが見つかった場合は、ループを短絡することができます。どれもマッチしていない場合は、その後、(要素が参照型であると仮定した場合)と一致する項目を返すメソッド、またはnullを使用することができます。

    foreach (var item1 in List1) 
        foreach (var item2 in List2) 
         if (item2 == item1) 
          return item1; 
    
    return null; 
    
    関連する問題