我怎样才能优化这个linq查询

时间:2014-07-02 13:01:04

标签: c# .net linq

有没有办法优化此查询?

_alternatives.Cast<AlternativePartName>()
                                .Where(alt => original.ToLower() == alt.CompName)
                                .Select(alt => alt.AltCompName).ToList();

我正在分析我的应用程序,这段代码是196毫秒的瓶颈之一,但它执行了很多次。

6 个答案:

答案 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(){...}