【发布时间】:2017-07-19 22:15:58
【问题描述】:
我真的很喜欢 C# 中的 GroupBy LINQ 方法。
我不喜欢的一件事是密钥总是被称为Key。
当我循环浏览这些组时,Key 什么也没说。因此,我必须查看上下文的其余部分以了解 Key 实际上是什么。
var grouped_by_competition = all_events
.GroupBy(e => e.Competition);
foreach ( var group in grouped_by_competition )
{
[...]
// ok what is Key for kind of object? I have to look at the outer loop to understand
group.Key.DoSomething();
}
当然你可以说这是一件小事,因为你只需要看看外循环。
在我看来,当您阅读它时,它仍然会消耗“大脑周期”。所以如果有好的替代品需要很少的样板,我想使用它。
有一些替代方案,但它们都添加样板代码或依赖于 cmets - 我都试图省略。
选项 1 - 循环内的额外变量
var grouped_by_competition = all_events
.GroupBy(e => e.Competition)
foreach ( var group in grouped_by_competition )
{
var competition = group.Key;
[...]
competition.DoSomething();
}
此解决方案添加了不必要的样板代码。
选项 2 - 额外选择
var grouped_by_competition = all_events
.GroupBy(e => e.Competition)
.Select(x => new { Competition = x.Key, Items = x } );
foreach ( var group in grouped_by_competition )
{
[...]
group.Competition.DoSomething();
}
此解决方案添加了不必要的样板代码。
选项 3 - 添加接近使用 Key 的注释
我宁愿拥有富有表现力的代码,而不是过时的 cmets。
总结
理论上是否有可能设计一个类似于匿名类功能的扩展方法?
var example = new { e.Competition };
example.Competition.DoSomething(); // property name deduced
所以我们得到:
var grouped_by_competition = all_events
.NamedGroupBy(e => e.Competition);
foreach ( var group in grouped_by_competition )
{
[...]
group.Competition.DoSomething();
}
【问题讨论】:
-
您关心
NamedGroupBy是否实现了选择,还是您想重新实现GroupBy?这是 EF 还是 SQL 还是 LINQ to Objects? -
我从 LINQ to Objects 中获得的最大收获(当然,如果它本身可以与 EF 一起使用,那将是一个加分项)。
-
我还不明白你的第一个问题是什么意思。从理论上讲,我不太关心实现本身,我主要是想让 GroupBy 'Useage' 更清洁。我更频繁地写/读 GroupBy,然后我会读/写这个扩展方法的实现:)
-
亲爱的投票者,这个问题的意见是如何建立的?有一个明确的无可争议的答案,Peter Duhino 给出了非常有见地的解释。
-
我试图想办法让
NamedGroupBy(基本上)成为GroupBy().Select()的宏,但在编译时这是不可能的。不要担心不发表评论的投票者。
标签: c# linq extension-methods readability