以下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);
}
}
}
答案 0 :(得分: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)
{
...
}