2016-05-18 12 views
2

私は匿名型でGroupByを使用していました:IEnumerable.GroupBy()で使用される型の要件は何ですか?

var v = list.GroupBy(x => new {x.street, x.houseNumber}); 
var o = v.Single(x => x.Key.street == "My Street" && x.Key.houseNumber == 42); 

それはとてもうまくいきました。

class StreetAddress 
{ 
public StreetAddress(string _street,int _houseNumber){...} 
public string street{get; set;} 
public int houseNumber{get;set;} 
} 
var v = list.GroupBy(x => new StreetAddress(x.street, x.houseNumber)); 
var o = v.Single(x => x.Key == new StreetAddress("My Street", 42)); 

は今、「V」は、すべてのグループ化されていません - 同じKey値を持つ項目の負荷、およびoは、任意のオブジェクトと一致しません:私はコンクリートの型にこれを回すことにしました。

StreetAddressに何を追加する必要があるので、これは匿名タイプと同じように機能しますか?

+0

を実装する方法であるリストはdefined.Itあなたは等価性をチェックするためにrefererenceタイプを使用しているという事実とは何かを持っているかもしれませんがどのように私たちを表示します。 StreetAddressを構造体にしてみてください。 – Glubus

+0

'list'は、2つのプロパティーを持つオブジェクトのコレクション上の別のLINQ呼び出しの結果であり、すべて正常です。構造体を使用することについて興味深いアイデアは、自動的にメンバーワイズ比較を取得?この簡単な場合は、より簡単かもしれません。 –

+0

単純なlinqステートメントを作成するには、StreetAddressクラスにIComparableを継承させ、CompareTo()メソッドを含めることができます。 – jdweng

答えて

7

StreetAddressに追加する必要があるものは、匿名タイプと同じように機能しますか?

EqualsおよびGetHashCodeをオーバーライドします。理想的には、IEquatable<StreetAddress>を実装しますが、ほとんどの場合はわかりやすくするためです。

あなたのお問い合わせは現在です。は、タイプが表す平等の唯一のタイプ - 参照平等によってグループ化されています。しかし、各アイテムの新しいインスタンスを作成するときに、2つのキーが互いに等しくなることはありません。ここで

+0

「IComparable」の実装についての別の議論があります。私は野生の飛躍を取ってあなたの答えが正しいと思いますが、それに触れることができますか?それは間違っていますか? –

+0

@ Mr.Boy:はい、間違っています。グループ化は、値を順序付けするのではなく、* equal *値を見つけることです。 –

+0

CompareTo()が生成されません。 – jdweng

-2

はIComparableを

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication93 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var v = StreetAddress.addresses.GroupBy(x => x); 
     } 
    } 
    class StreetAddress : IComparable 
    { 
     public static List<StreetAddress> addresses { get; set; } 
     public string street { get; set; } 
     public int houseNumber { get; set; } 

     public StreetAddress() { ; } 
     public StreetAddress(string _street, int _houseNumber) 
     { 
      StreetAddress newAddress = new StreetAddress(); 
      addresses.Add(newAddress); 
      newAddress.street = _street; 
      newAddress.houseNumber = _houseNumber; 
     } 
     public int CompareTo(object _other) 
     { 
      int results = 0; 
      StreetAddress other = (StreetAddress)_other; 
      if (this.street != other.street) 
      { 
       results = this.street.CompareTo(other.street); 
      } 
      else 
      { 
       results = this.houseNumber.CompareTo(other.houseNumber); 
      } 

      return results; 
     } 

    } 


} 
+1

'IComparable'は順序付けであり、グループ化ではありません。グループ化は等価比較を使用します。 –

関連する問題