2011-07-13 36 views
1

以下LINQ语句为特定属性查找具有重复值的项目,按count对它们进行分组,然后执行另一个分组以获取布尔返回值。如何优化此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); 
     } 
    } 
} 
+1

你有什么样的改进? – Oded

+1

您面临的性能受到了什么影响? – V4Vendetta

+0

对不起,编辑问题添加更多信息。我并没有真正感受到明显的性能下降,这对我来说有点浪费。无论如何,我都不是LINQ大师。 – Marlon

回答

2

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

我会说这是要走的路,优化可读性。三层嵌套通常难以阅读和修改。 – KevDog

+0

我还能从那里得到布尔键吗? – Marlon

+0

@Marlon:看我的编辑。 –