过去两天我一直在墙上敲我的头,但我无法改善以下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 列表中搜索<b> obj.classname 。一旦在classesname列表中找到,我需要返回obj1类名。
我列表中有5千个对象。
上述查询运行时间超过30秒。我需要将这段时间减少到5秒以内。
我很困惑,每一个帮助都会计算在内。
提前致谢。
答案 0 :(得分:1)
一个显而易见的改进是移出Count > 0
的{{1}}条件,因此您根本不必考虑这些项目:
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})
是ClassesName
,您也可以进行一些预处理以使用List<string>
。这将使查找O(1)而不是O(n),其中n为list1中的项目数。
答案 1 :(得分: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});
这会在找到匹配时停止查看,这就是Any所做的,这会减少您查看的记录数量,但也许我不明白您要完成的任务。