我如何优化这个linq查询

本文关键字:linq 查询 优化 何优化 | 更新日期: 2023-09-27 18:11:12

是否有办法优化这个查询?

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

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

我如何优化这个linq查询

与其对每个条目调用ToLower,不如只调用一次:

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

您应该尝试在.AsParallel()中使用更多的内核-这可能是对具有长字符串的大列表的改进

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

我假设"original"answers"CompName"是字符串。如果是,那么您应该执行以下操作:

_alternatives.Cast<AlternativePartName>()
                                .Where(alt => String.Equals(original, alt.CompName, StringComparison.OrdinalIgnoreCase))
                                .Select(alt => alt.AltCompName).ToList();

使用正确的数据结构是提高性能的最佳方法。在您的情况下,如果您使用以CompName为键并以AltCompNames为项的列表的字典会更好。查找会非常快,因为不需要迭代,只需要一次查找。保持这种简单的结构与时俱进,添加和删除项目应该不是一个大问题。

只调用一次orignal.ToLower()不会改变任何实际的性能。

尝试使用例如Parallel LINQ来获得更快的结果,如果你有足够的cpu功率。

我不太懂点语法,但是这个

.Select(alt => alt.AltCompName)

结合
_alternatives.Cast<AlternativePartName>()

可以通过选择直接生成AlternativPartName

来实现
select new AlternativePartName(){...}