2012-02-25 69 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中的项目数。