1

OrderItems 可以有或没有首选项。我想按偏好对我的订单项进行分组。但只有一种类型的偏好(4),否则它们应该属于“空”组。

此代码有效,但其他编码人员告诉我它很烂(但不建议解决方案)。我能做什么 ?

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;
    }  
}
4

1 回答 1

1

我们不知道静态类型是什么OrderItem.Preferences.First()——尽管它应该Preference是正确的,但从您的代码看来它不是(i是从 中提取的东西Orderitem.Preferences,但它aPreference而不是一个)。

尽管这看起来不对,但我将忽略它并假设从现在开始的类型iFoobar。正如代码所暗示的那样,我将把它Foobar视为具有属性Preference和。Order

最直接的解决方案是创建一个虚拟Foobar对象并将其用作占位符:

var placeholder = new Foobar() { Preference = null, Order = -1 };

然后方法的主体可以简化为

return OrderItems
       .GroupBy(item => item.Preferences.FirstOrDefault(p =>
                                          p.Preference.PreferenceGroup.Type == 4)
                        ?? placeholder)
       .OrderBy(g => g.Key.Order);

当然,这会改变返回值,因为“null”组没有null键,但null由于其语义,有键可能是一个坏主意。如果“空组”对某些东西进行建模,则创建placeholder一个static readonly字段,以便消费者可以对其进行检查。

于 2013-10-06T19:04:17.047 回答