OrderItems可以有或没有偏好。我想按优先顺序对我的订单进行分组。但只有一种类型的首选项(4),否则它们应属于“null”组。
此代码有效,但其他程序员告诉我它很糟糕(但不建议解决方案)。我该怎么办?
public IEnumerable<IGrouping<Preference,OrderItem>> OrderItemsGrouped {
get {
var grouped = OrderItems
.GroupBy(item =>
{
var i = item.Preferences.FirstOrDefault(p => p.Preference.PreferenceGroup.Type == 4);
if (i != null) return i.Preference;
else
{
return null;
}
})
.OrderBy(k => { return k.Key == null ? -1 : k.Key.Order; });
return grouped;
}
}
答案 0 :(得分:1)
我们不知道OrderItem.Preferences.First()
的静态类型是什么 - 即使它应该是Preference
所有正确的,从您的代码看起来它不是({{ 1}}来自i
,但 一个Orderitem.Preferences
而不是 一个。)
即使看起来不对,我也会忽略它,并假设Preference
的类型从现在开始是i
。我将把Foobar
视为具有属性Foobar
和Preference
,正如代码所暗示的那样。
最直接的解决方案是创建一个虚拟Order
对象并将其用作占位符:
Foobar
然后该方法的主体可以简化为
var placeholder = new Foobar() { Preference = null, Order = -1 };
当然这会改变返回值,因为“null”组没有return OrderItems
.GroupBy(item => item.Preferences.FirstOrDefault(p =>
p.Preference.PreferenceGroup.Type == 4)
?? placeholder)
.OrderBy(g => g.Key.Order);
键,但由于其语义,使用null
键可能是一个坏主意。如果“空组”对某些内容进行建模,则将null
设为placeholder
字段,以便消费者可以对其进行检查。