2013-12-17 23 views
1

我有兩個不同的對象列表,其中一個是IQueryable集合(捲起到數組中),另一個列表集合。兩組中的對象共享一個稱爲ID的字段;第二組中的每個對象將與第一組中的對象相匹配,但不一定相反。我需要能夠處理這兩個組(匹配和不匹配)。在這種情況下,兩個集合的大小在300到350個對象之間(作爲參考,爲第二集合中的對象生成的XML通常不超過7k,因此可能認爲實際內存的一半到三分之二大小由每個集合中的每個對象使用)。C#在不同列表中匹配項目

我現在設置的方式是循環迭代IQueryable集的數組表示形式,使用LINQ語句來查詢匹配記錄的列表集。這需要太多時間;我正在運行帶有10GB內存的Core i7,它需要10秒到2.5分鐘的時間來匹配和比較對象。任務管理器不顯示任何巨大的內存使用情況 - 陰影低於25MB。我的系統線程也沒有被徵稅。

是否有一種方法或算法可以讓我將每個集合中的對象一次配對,從而以更快的速度迭代對和不匹配的對象?這組對象是8000+這一計劃將必須通過每天咀嚼一旦上線的只是一小部分......

編輯:這是我在實際運行的代碼......

 for (int i = 0; i < draftRecords.Count(); i++) 
     { 
      sRecord record = (from r in sRecords where r.id == draftRecords.ToArray()[i].ID select r).FirstOrDefault(); 
      if (record != null) 
      { // Do stuff with the draftRecords element based on the rest of the content of the sRecord object 

回答

2

您應該使用諸如Enumerable.JoinEnumerable.GroupJoin之類的方法來匹配兩個集合中的項目。這將比嵌套for循環快得多。

由於您想將一組密鑰與第二個列表中可能存在或不存在的項目進行匹配,因此GroupJoin可能更合適。這看起來像這樣:

var results = firstSet.GroupJoin(secondSet, f => f.Id, s => s.Id, (f,sset) => new {First = f, Seconds = sset}); 

foreach(var match in results) 
{ 
    Console.WriteLine("Item {0} matches:", match.First); 
    foreach(var second in item.Seconds) 
     Console.WriteLine(" {0}", second); // each second item matching, one at a time 
} 
+0

謝謝!我會試一試,看看它是如何發展的。 – Ant

+0

@Ant放入一些代碼演示 –

1

你的問題是缺乏示例代碼/信息,但我個人看來使用類似的方法;加入,相交或包含。如有必要,使用選擇可以對要匹配的字段進行投影,或定義自定義IEqualityComparer

相關問題