6

具体的な例が見つからないので、質問を投稿しています。助けていただければ幸いです。

私は2つの大きな一般的なリストを持っており、どちらも30万を超えるアイテムがあります。

最初のリストをループして情報をプルバックし、新しいリストの新しいアイテムをその場で生成していますが、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);
  }
4

4 に答える 4

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();
于 2012-08-15T09:30:53.027 に答える
3

ルックアップリストから辞書にデータを移動できます。キーは、検索している3つのアイテムの一意のハッシュです。そうすれば、非常に迅速なルックアップが可能になり、何百万もの反復を節約できます。

于 2012-08-15T09:28:06.093 に答える
3

私の完全な投稿を確認してください:匿名タイプを使用して複数の列でLinq結合

あなたのために働く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の結合

ここに画像の説明を入力してください

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;
于 2012-08-15T09:28:49.783 に答える
1

LINQを使用してリストに参加し、好きなように返します。

例えば

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 };

外部結合を行うには、DefaultIfEmpty()を使用できます。この例では、結合が行われなかった場合に、結合の右側の部分をデフォルトオブジェクト(多くの場合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"
}
于 2012-08-15T09:29:19.953 に答える