有没有办法优化此查询?
_alternatives.Cast<AlternativePartName>()
.Where(alt => original.ToLower() == alt.CompName)
.Select(alt => alt.AltCompName).ToList();
我正在分析我的应用程序,这段代码是196毫秒的瓶颈之一,但它执行了很多次。
答案 0 :(得分:5)
不要为每件商品调用ToLower
,而只需将其称为 一次:
var lower = original.ToLower();
_alternatives.Cast<AlternativePartName>()
.Where(alt => lower == alt.CompName)
.Select(alt => alt.AltCompName).ToList();
答案 1 :(得分:2)
您应该尝试将更多核心用于.AsParallel()
- 这可能是对具有长字符串的大型列表的改进
string lower = original.ToLower();
_alternatives.Cast<AlternativePartName>()
.AsParallel()
.Where(alt => lower == alt.CompName)
.Select(alt => alt.AltCompName)
答案 2 :(得分:0)
我假设&#34;原来&#34;和&#34; CompName&#34;是字符串。如果是,那么您应该执行以下操作:
_alternatives.Cast<AlternativePartName>()
.Where(alt => String.Equals(original, alt.CompName, StringComparison.OrdinalIgnoreCase))
.Select(alt => alt.AltCompName).ToList();
答案 3 :(得分:0)
使用正确的数据结构是提高性能的最佳方法。在您的情况下,如果您使用字典CompName
作为关键字并且AltCompNames
列表是项目,那会更好。查找速度非常快,因为没有迭代,只有单个查找。通过添加和删除项目保持这种简单的结构最新应该不是一个大问题。
答案 4 :(得分:0)
只调用一次orignal.ToLower()
不会改变任何真正的性能。
尝试使用例如如果你有足够的CPU-Power,那么并行LINQ可以更快地获得结果。
答案 5 :(得分:-2)
我对点语法不太满意,但是这个
.Select(alt => alt.AltCompName)
结合本
_alternatives.Cast<AlternativePartName>()
可以通过选择直接制作AlternativPartName
来实现select new AlternativePartName(){...}