C# 如何优化此LINQ语句以提高速度?

C# 如何优化此LINQ语句以提高速度?,c#,.net,linq,performance,optimization,C#,.net,Linq,Performance,Optimization,下面的LINQ语句为特定属性查找具有重复值的项,按计数对它们进行分组,然后再进行另一次分组以返回布尔值 我只是好奇如何改进它,这似乎有点浪费,因为这是对象模型验证库的一部分,我很想尽快得到它 执行速度是优先事项,但欢迎提出任何其他建议 var grouped = from g2 in (from i in item.ParentList where _filter(i) group i by

下面的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);
        }
    }
}

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

你想做什么样的改进?你面临的性能打击是什么?对不起,我已经编辑了问题以添加更多信息。我并没有真正体验到任何明显的性能下降,只是(在我看来)有点浪费。我无论如何都不是LINQ大师。@Marlon为什么要优化一些不会给你带来任何麻烦的东西?我总是想学习一些东西-我只是觉得查询看起来不像是在尽其所能地使用LINQ。我想这是一条路,优化可读性。三级嵌套通常很难阅读和修改。我仍然可以从中获得布尔键吗?