2016-12-09 5 views
3

私はLinqでグループ化したいオブジェクトのリストを持っています。オブジェクトタイプはGroupRatingです。私はそれらを "Params"プロパティでグループ化したいと思います。Linq - 私自身のタイプと匿名タイプのGroupByの使用

public class GroupRating 
{ 
    public long Id { get; set; } 
    public Parameters Params { get; set; } 
} 

public class Parameters 
{ 
    public int CarrierId { get; set; } 
    public int CustomerId { get; set; } 
} 

事は、これが動作することである: (つまり私は、すべてのIDを持つ唯一のグループを取得。)

 var myList = new List<GroupRating>(); 
     ... blahblah code... 

     var groupedList = myList.GroupBy(i => new { 
      CarrierId = i.Params.CarrierId, 
      CustomerId = i.Params.CustomerId 
     }, i => i.Id).ToArray(); 

しかし、これは動作しません: (つまり、私はできるだけ多く取得します。グループにはIDがあるように)

 var myList = new List<GroupRating>(); 
     ... blahblah code... 

     var groupedList = myList.GroupBy(i => new Params { 
      CarrierId = i.Params.CarrierId, 
      CustomerId = i.Params.CustomerId 
     }, i => i.Id).ToArray(); 

なぜか?

おかげ

答えて

6

あなたclassEquals(object)GetHashCode()を正しくオーバーライドする必要があります。そうでなければ、2つのnew Params { ... }は同じに見えても "等しくない"。

匿名型は、これら2つのメソッドを自動的にオーバーライドします。

structSystem.ValueTypeに存在しEquals(object)GetHashCode()のオーバーライドを使用していますので、あなたはまた、代わりにclassstructを使用することができます。 structを選択した場合は、タイプを不変にしてとすることを検討してください。つまり、プロパティを読み取り専用(またはprivate set;)にします。

+1

+1、しかし...構造体におけるA.デフォルトの '' Equals'とGetHashCode'が遠く最適からなので、私も構造体を使用している場合、それらを上書きお勧めします、とB.可能であれば、クラスでさえ、不変性を考慮する価値が常にあります。 –

+0

@JonHanna私はそれに同意します(しかし、 'ValueType'の実装は、構造体が両方とも' int'型の2つの非静的フィールドしか持たない特定の場合にはどれくらい非効率的ですか?)。 –

+0

完全に気違いではないほど効率が悪いと思います。それは反映されていて、かなりうまく反映されています。私はすべて楽しみと利益のためにリフレクションしていますが、あなたが平等のために比較することは決してないでしょうか。 –

0

クラスまたは匿名の型を使用する必要があります。パーマネントはクラスではありません。使用できます。

これを試してみてください:

var groupedList = myList.GroupBy(i => new Parameters { 
       CarrierId = i.CarrierId, 
       CustomerId = i.CustomerId 
      }, i => i.Id).ToArray(); 
関連する問題