C# LINQ查询改进

C# LINQ查询改进,c#,.net,C#,.net,在过去的两天里,我一直把头撞在墙上,但我无法改善接下来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列表中找到后,我需要返

在过去的两天里,我一直把头撞在墙上,但我无法改善接下来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类名

我的清单上有五千件物品

以上查询运行时间超过30秒。我需要把这个时间缩短到5秒以下

我很困惑,每一个帮助都很重要

提前谢谢

(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所做的,这将减少您查找的记录数,但可能我不明白您试图完成的任务。

一个明显的改进是将
列表1的
计数>0
条件移出,所以你根本不需要考虑那些项目:

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
是一个
列表
,因此您还可以进行一些预处理,以使用
哈希表
。这将使查找变成O(1)而不是O(n),n是列表1中的项数。

您是否尝试过使用普通循环?我让LINQ查询运行得很慢,我只是用普通的构造替换它们,有时它们运行得更快。这是否应该只返回1个结果?或者大量的结果?我认为提供一些示例数据和预期的输出会有所帮助,因为还不清楚“ClassesName”的类型(字符串?字符串数组?)以及包含是否意味着子字符串或集合操作。如果是集合,是否需要不区分大小写?obj1.Count指的是什么?我使用的是正常循环,它花了2分钟多的时间。这是一场灾难。你能发布obj和obj1类吗?我认为你的部分问题是,你在做250000个string.contains操作,这永远不会是快速的为什么会更快?(只是好奇)。System.Linq.Enumerable.Any在找到结果时停止。为什么将其作为静态方法而不是扩展方法调用?看起来很奇怪,伊姆霍:)我确信这并不重要,我在学习linq时是如何开始的,称之为怪癖,来自t/SQL它模仿了内联选择的工作方式,所以我想它对我来说更具可读性。