按子属性分组

时间:2013-10-06 18:46:00

标签: c# .net linq

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

1 个答案:

答案 0 :(得分:1)

我们不知道OrderItem.Preferences.First()的静态类型是什么 - 即使它应该是Preference所有正确的,从您的代码看起来它不是({{ 1}}来自i,但 一个Orderitem.Preferences而不是 一个。)

即使看起来不对,我也会忽略它,并假设Preference的类型从现在开始是i。我将把Foobar视为具有属性FoobarPreference,正如代码所暗示的那样。

最直接的解决方案是创建一个虚拟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字段,以便消费者可以对其进行检查。