2012-08-15 7 views
6

具体的な例が見つからないため、質問を投稿しています。どんな助けもありがたい。2つの大きな汎用リストの比較

私は2つの大きな汎用リストを持っていますが、どちらも300Kアイテムを超えています。

私は最初のリストをループして情報を引き出し、新しいリストの新しいアイテムを即座に生成しますが、2番目のリスト内で検索し、3つの一致基準に基づいて値を返しますあなたが想像することができるように、リストに追加するには、この300k * 300k回を行うことは時間がかかります。

これをより効率的に行う方法はありますか?

マイコード:

var reportList = new List<StocksHeldInCustody>(); 
foreach (var correctDepotHolding in correctDepotHoldings) 
    { 
    var reportLine = new StocksHeldInCustody(); 
    reportLine.ClientNo = correctDepotHolding.ClientNo; 
    reportLine.Value = correctDepotHolding.ValueOfStock; 
    reportLine.Depot = correctDepotHolding.Depot; 
    reportLine.SEDOL = correctDepotHolding.StockCode; 
    reportLine.Units = correctDepotHolding.QuantityHeld; 
    reportLine.Custodian = "Unknown"; 
    reportLine.StockName = correctDepotHolding.StockR1.Trim() + " " + correctDepotHolding.StockR2.Trim(); 

    //Get custodian info 

    foreach (var ccHolding in ccHoldList) 
    { 
     if (correctDepotHolding.ClientNo != ccHolding.ClientNo) continue; 
     if (correctDepotHolding.Depot != ccHolding.Depot) continue; 
     if (correctDepotHolding.StockCode != ccHolding.StockCode) continue; 
     if (correctDepotHolding.QuantityHeld != ccHolding.QuantityHeld) continue; 
     reportLine.Custodian = ccHolding.Custodian; 
     break; 
    } 
    reportList.Add(reportLine); 
    } 
+0

がオブジェクトで一緒にすべてのVARSのハッシュを作成し、これらのみをチェックし、それが高速で実行する必要があります – EaterOfCode

+1

データのソースは何ですか?まともなデータベースであれば、この方が良いかもしれません。 –

+0

linqで外部結合を実行する方法の詳細について一般的な回答を更新しました – Arkiliknam

答えて

5

Pranayが言うように、参加するには、あなたが望むものはおそらくです:

var query = from correct in correctDepotHoldings 
      join ccHolding in ccHoldList 
       on new { correct.ClientNo, correct.Depot, 
         correct.StockCode, correct.QuantityHeld } 
       equals new { ccHolding.ClientNo, ccHolding.Depot, 
          ccHolding.StockCode, ccHolding.QuantityHeld } 
      // TODO: Fill in the properties here based on correct and ccHolding 
      select new StocksHeldInCustody { ... }; 
var reportList = query.ToList(); 
+0

こんにちは、私はそれを使用する前に、変数としてこれを宣言する必要がありますか "等号"と "ccHolding"キーワードでエラーを取得していますか? –

+0

@DavidJohnson:おっと、 "中"の部分を忘れてしまった。私の編集を見てください。LINQを初めてお使いの方は、十分に学ぶために少し時間を置いておきます。 –

+0

ありがとうございます - 私はしようとしていますが、ちょうどパターンが無作為に構成されている場合はいくつかのように思える、私は学ぶことを学ぶのちょうどその場合を学ぶ!再度、感謝します。 –

3

あなたは鍵があなたが検索している3つの項目の一意のハッシュされた状態で、辞書にルックアップリストからデータを移動することができます。その後、非常に迅速なルックアップを行い、数百万回の反復を保存します。

3

は私の完全なポストをチェックしてください:Linq Join on Mutiple columns using Anonymous type

は、LINQの内部の使用は、それはあなたのための作業を行います参加してください。

var list = (from x in entity 
      join y in entity2 
      on new { x.field1, x.field2 } 
     equals new { y.field1, y.field2 } 
     select new entity { fields to select}).ToList(); 

リストに参加して、あなたが好きどのようにそれを返すためにLINQを使用して、複数のフィールドにLINQの

enter image description here

EmployeeDataContext edb= new EmployeeDataContext(); 
var cust = from c in edb.Customers 
      join d in edb.Distributors on 
      new { CityID = c.CityId, StateID = c.StateId, CountryID = c.CountryId, 
        Id = c.DistributorId } 
      equals 
      new { CityID = d.CityId, StateID = d.StateId, CountryID = d.CountryId, 
        Id = d.DistributorId } 
      select c; 
+0

その結合構文は無効です。正しい例は私の答えを見てください。 –

+1

@JonSkeet - ちょうど更新.......ありがとうございます –

1

に参加。この例では、あなたの右の部分を設定している

例えば

var list1 = GetMassiveList(); 
var list2 = GetMassiveList(); 

var list3 = from a in list1 
      join b in list2 
       on new { a.Prop1, a.Prop2 } equals 
        new { b.Prop1, b.Prop2 } 
      select new { a.Prop1, b.Prop2 }; 

あなたのoutterが参加するためには、DefaultIfEmpty() を使用することができますどこwasn参加する場合のデフォルトのオブジェクト(多くの場合はnull)に参加作られていない。

例えば

from a in list1 
join b in list2 
    on new { a.Prop1, a.Prop2 } equals 
     new { b.Prop1, b.Prop2 } 
into outer 
from b in outer.DefaultIfEmpty() 
select new 
    Prop1 = a.Prop1, 
    Prop2 = b != null ? b.Prop2 : "Value for Prop2 if the b join is null" 
} 
関連する問題