2013-10-06 120 views
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; 
    } 
} 
+0

除非'Preference'重寫'Equals',否則不能「按優先級分組」,因爲默認實現使用引用相等(因此不會有任何偏好與其他任何偏好相等)。可以? – Jon

+0

是的,它確實ovveride – GorillaApe

回答

1

我們不知道的靜態類型的OrderItem.Preferences.First()會是什麼 - 即使它應該由所有的是一個Preference是正確的,從你的代碼看起來它不是(i東西從Orderitem.Preferences拉,但它具有 a Preference而不是之一)。

即使這看起來不對,我會忽略它,並且從現在開始假定i的類型是Foobar。正如代碼所暗示的那樣,我打算將Foobar視爲屬性PreferenceOrder

最直接的解決方案是創建一個虛擬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字段,以便消費者可以檢查它。

+0

我是一個OrderItemPreference對象。它的膠水。它是必需的,因爲首選項可以有數量和其他屬性。 OrderItemPreference具有屬性首選項,首選項屬於首選項組。首選項有一個屬性指向它的PreferenceGroup – GorillaApe