【问题标题】:How can I optimize this LINQ statement for speed?如何优化此 LINQ 语句以提高速度?
【发布时间】:2011-07-13 10:57:58
【问题描述】:

以下 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 大师。
  • @Marlon 为什么要优化一些不会给您带来任何麻烦的东西?
  • 我总是乐于学习一些东西 - 我只是认为查询看起来不像是尽其所能地使用 LINQ。

标签: c# .net linq performance optimization


【解决方案1】:

正如 Oskar 所说,您可能不希望优化查询以提高速度,除非分析表明它会导致问题。 Premature optimization is the root of all evil。如果你想优化查询的可读性,这里有一种简化第二部分的方法:

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

【讨论】:

  • 我会说这是要走的路,优化可读性。三级嵌套通常难以阅读和修改。
  • 我还能从中得到布尔键吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-24
  • 2011-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多