2013-01-11 11 views
5

私は2つのテーブル、自分のモデルと各...マッチング二つのリスト

class FamilyMan 
    { 
     public int family_ID {get; set;} 

     public string name {get; set;} 
     public string fav_color {get; set;} 
    } 

    class BusinessMan 
    { 
     public int work_ID {get; set;} 

     public string name {get; set;} 
     public string fav_color {get; set;} 

     //unrelated data etc 
     public string job_title {get; set;} 
    } 

を持っている...と私は上のベースのマッチングBusinessMansにすべてFamilyMansを一致させることができるようにしたいですnameおよびfav_color

私は現在のようなものがあります。

//fill lists from database 
    var family_list = dbContext.FamilyMen.ToList(); 
    var busy_list = dbContext.BusinessMen.ToList(); 
    //create empty dict for matching the two types 
    var matches = new Dict<FamilyMan, BusinessMan>(); 


    foreach (FamilyMan fam_man in family_list) { 
     foreach (BusinessMan busy_man in busy_list) { 
      //if both names and colors match, consider them a matching 
      //object and add them each to the dict 
      if (fam_man.name == busy_man.name && 
        fam_man.color == busy_man.color) { 
       matches_MtO[fam_man] = busy_man; 
      } 
     } 
    } 

をそれが完了するまでにかなりの時間がかかります。

私はまた、foreachで1つのリストをループし、LINQs FirstOrDefaultを使ってそれにマッチさせることを検討しましたが、効率はほぼ同じです。

FamilyManBusinessManを一緒にマッチングさせるより良い方法はありますか?

答えて

3

あなたは、LINQの結合構文を使用する必要があります。これにより、バックエンドデータベースは照合を行い、結果のみを返すことができます。複合キーに参加できるようにするために

MSDN guidance here.

var query = from fm in dbContext.FamilyMen 
      join bm in dbContext.BusinessMen on 
       new { bm.name, bm.color } equals new { fm.name, fm.color } 
      select new { 
       FamilyMan = fm, 
       BusinessMan = bm 
      }; 

var resultList = query.ToList(); 
+0

最初の2つの匿名オブジェクトにそれぞれ一致する名前を付けなければなりませんでした。名前は' Name'、色は 'Color'です。これは本当にうまくいっています。可能ならば、 'Expected Expected'問題を解決するために質問を修正するために@Gerveを与えます。そうでなければ、私はこの答えを受け入れます。ありがとう! – TankorSmash

+0

「一致する名前」は、両方のオブジェクトの 'new {Name = bm.name、Color = bm.color} 'のようなものです。たとえば、OrdersテーブルとOrderDetailsテーブルで列の名前が違っていた場合、匿名型に同じ名前を割り当てることで複合キーを作成することができます。 – TankorSmash

2

あなたは両方のリストをループしています。これはO(N-squared)です。

アイテムが一致すると、再び一致させる必要はありません。一致した項目をリストから削除して不要な比較を減らすことができます。

さらに、2つのプロパティが同じであるため、組み合わせプロパティを表すハッシュをキーとして辞書を構築できます。次に、family_list_dictionaryのキーをループし、busy_list_dictionaryで一致するキーを探します。

+0

に従うが、私は前にハッシュで働いたことがありません、あなたはぶっきらぼう任意の良い例がありますか?どちらのテーブルをループして、2つのプロパティを取得し、何らかの形でハッシュに変換し、ハッシュをリストに保存してから、ハッシュリストを参照して、ビジネスハッシュと家族のハッシュを比較しますか? – TankorSmash

+0

私は現在コンピュータにいません。私は数時間で具体的な例を挙げることができます。 –

+0

心配する必要はありませんが、私は実際の答えを見つけましたhttp://stackoverflow.com/a/14283717/541208。私はそのようなことをする方法を学びたいですが、心配はありません。 – TankorSmash

4

このようなLINQクエリは、より速く次のようになります。

var matches = (
    from f in family_list 
    join b in busy_list 
    on f.color == b.color 
    && f.name == b.name 
    select new {f, b} 
); 
+0

'... == b.color'の後に'&&'は動作していないようです。 'Expression Expected' – TankorSmash

関連する問題