2012-02-25 53 views
3

我過去兩天一直在牆上敲打我的頭,但我無法改進以下LINQ的計時。LINQ查詢改進

from obj in list 
from obj1 in list1 
where (obj1.ClassesName.Contains(obj.ClassName) && obj1.Count> 0) 
select new { result = obj1.ClassName}) 

我需要obj1.classesname列表來搜索obj.classname。一旦在classesname列表中找到,我需要返回obj1類名。

我在列表中有5千個對象。

上面的查詢需要超過30秒的時間才能運行。我需要在5秒鐘之內減少這段時間。

我很困惑,每一次的幫助都會計算在內。

在此先感謝。

+0

您是否嘗試過使用普通循環?我有LINQ查詢運行緩慢,我剛剛用正常的結構替換它們,有時它們運行得更快。 – 2012-02-25 05:08:47

+1

應該只返回1個結果嗎?或許多結果? – 2012-02-25 05:09:26

+0

我認爲提供一些示例數據和期望的輸出會有幫助,因爲不清楚「ClassesName」的類型是什麼(string?string數組?),以及Contains是作爲子字符串還是集合操作。如果收集,是否需要區分大小寫? obj1.Count指的是什麼? – 2012-02-25 05:13:10

回答

0
(from obj1 in list1 
where (obj1.Count > 0) && System.Linq.Enumerable.Any(from obj in list where obj1.ClassesName.Contains(obj.ClassName) select obj) 
select new { result = obj1.ClassName}); 

這將停止尋找,當它找到一個匹配,那是什麼呢任何,這將減少你翻翻記錄的數目,但也許我不明白你正在試圖完成什麼。

+0

爲什麼這麼快? (只是好奇)。 – 2012-02-25 05:15:05

+2

System.Linq.Enumerable.Any在找到結果時停止 – 2012-02-25 05:16:03

+0

爲什麼將其稱爲靜態方法而不是擴展方法?似乎很奇怪恕我直言:) – 2012-02-25 05:32:58

1

一個明顯的改進是移動Count > 0條件list1出來,這樣你就不用考慮這些項目都:

from obj in list 
from obj1 in list1.Where(x=> x.Count >0) 
where (obj1.ClassesName.Contains(obj.ClassName)) 
select new { result = obj1.ClassName}) 

由於ClassesNameList<string>你可以做一些預處理如以代替使用Hashtable<string>。這將使查找O(1)而不是O(n),其中n是list1中的項目數。