2011-06-28 6 views
0
.GroupBy(x => x) 

.GroupByは等同様のタイプのグループ列、INTに使用されます。 次に、同様のタイプのリスト<文字列をグループ化するためにどのような関数を使用できますか。C#での同様のタイプのリスト<string>グルーピング

+2

あなたの質問は私には分かりません。 –

+1

あなたが望むものはかなり不明ですが、 'GroupBy(x => x.GetType())'でしょうか? –

+1

サンプル入力、出力はこちら – Snowbear

答えて

2

GroupByは、目的のために適切な方法でEquals/GetHashCodeを実装する要素の種類に依存します。

あなたの質問は明確ではありませんが、私は同じ要素を持つ2つのリストを等価と見なしたいと思っています。独自のIEqualityComparer実装を作成し、それをGroupByに渡す必要があると思われます。例えば、(未テスト):

public class ListEqualityComparer<T> : IEqualityComparer<List<T>> 
{ 
    private static readonly EqualityComparer<T> ElementComparer = 
     EqualityComparer<T>.Default; 

    public int GetHashCode(List<T> input) 
    { 
     if (input == null) 
     { 
      return 0; 
     } 
     // Could use Aggregate for this... 
     int hash = 17; 
     foreach (T item in input) 
     { 
      hash = hash *31 + ElementComparer.GetHashCode(item); 
     } 
     return hash; 
    } 

    public bool Equals(List<T> first, List<T> second) 
    { 
     if (first == second) 
     { 
      return true; 
     } 
     if (first == null || second == null) 
     { 
      return false; 
     } 
     return first.SequenceEqual(second, ElementComparer); 
    } 
} 

また、各ListEqualityComparerインスタンスを使用すると、大文字と小文字を区別しないやり方で文字列の(例えば)のリストを比較することができるようになる別の要素ごとの比較演算を、持っている可能性があります。

+0

FYI: 'IEqualityComparer'を' EqualityComparer'に変更するか、 'override'修飾子を二つのメソッドから削除してください。 – NtFreX

+0

@NtFreX:ありがとう。修飾子を削除しました。 –

0

カスタムタイプのオブジェクトでグループ化する方法をお伺いしているとします。

オブジェクトをどのように比較するかを定義する必要があります。
コールでIEqualityComparerを指定すると、これを行うことができます。

あなたがもしそうならタイプTは、System.IEquatable<T>インターフェイスを実装しているかどうかチェックする、そしてIEqualityComparer.Defaultが使用され、IEqualityComparerを指定しない場合は、その実装を使用EqualityComparer<T>を返します。それ以外の場合は、Tによって提供されるObject.EqualsおよびObject.GetHashCodeのオーバーライドを使用するEqualityComparer<T>を返します。

関連する問題