1

OrderItems には、設定がある場合とない場合があります。注文項目を好みでグループ化したいのですが、1つのタイプ(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;
    }  
}
4

1 に答える 1

1

の静的型がどうなるかはわかりませんOrderItem.Preferences.First()-それはすべて正しいはずですがPreference、コードからはそうではないように見えます(iから引っ張られたものですが、1ではなくaOrderitem.Preferencesがあります)。Preference

それは間違っているように見えますが、私はそれを無視して、今後は の型を仮定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はおそらく悪い考えです。「null グループ」が何かをモデル化する場合は、消費者がそれに対してチェックできるようplaceholderにフィールドを作成します。static readonly

于 2013-10-06T19:04:17.047 に答える