如何优化这个LINQ语句以提高速度?

本文关键字:语句 LINQ 高速度 何优化 优化 | 更新日期: 2023-09-27 18:02:35

下面的LINQ语句查找具有重复值的特定属性项,按计数对它们进行分组,然后进行另一次分组以返回布尔值。

我只是好奇如何改进,它似乎有点浪费,因为这是对象模型验证库的一部分,我很想让它尽可能快。

执行速度是优先考虑的,但欢迎任何其他建议。

var grouped = from g2 in
                 (from i in item.ParentList
                  where _filter(i)
                  group i by propGetter(i) into g
                  select new { Count = g.Count(), Items = g })
              group g2 by g2.Count == 1 into g3
              select new { IsUnique = g3.Key, Items = g3 };
foreach (var g in grouped)
{
    foreach (var grp in g.Items)
    {
        foreach (var itm in grp.Items)
        {
            if (g.IsUnique == false)
                itm.AddPropertyError(_propertyName, (int)Validations.Unique, _message);
            else
                itm.RemovePropertyError(_propertyName, (int)Validations.Unique);
        }
    }
}

如何优化这个LINQ语句以提高速度?

正如Oskar所说,您可能不希望为了速度而优化查询,除非分析显示它会导致问题。过早的优化是万恶之源。如果您想优化查询的可读性,下面是简化第二部分的一种方法:

var items = grouped
    .SelectMany(group => group.Items)
    .SelectMany(group => group.Items)
foreach (var item in items)
{
    ...
}

编辑关于你的评论:啊,我没有注意到你在最内层的循环中引用了g.IsUnique。这里有一种不需要3层缩进就能解决这个问题的方法,但它可能不是最好的方法:

var uniqueItems = grouped
    .Where(group => group.IsUnique)
    .SelectMany(group => group.Items)
    .SelectMany(group => group.Items)
var nonUniqueItems = grouped
    .Where(group => !group.IsUnique)
    .SelectMany(group => group.Items)
    .SelectMany(group => group.Items)
foreach (var item in uniqueItems)
{
    ...
}
foreach (var item in nonUniqueItems)
{
    ...
}