0

なぜグループ化が機能しないのか、よくわかりIEnumerable<string>ません。もちろん、カスタム IEqualityComparer を提供しています。

public class StringCollectionEqualityComparer : EqualityComparer<IEnumerable<string>>
{
    public override bool Equals(IEnumerable<string> x, IEnumerable<string> y)
    {
        if (Object.Equals(x, y) == true)
            return true;
        if (x == null) return y == null;
        if (y == null) return x == null;

        return x.SequenceEqual(y, StringComparer.OrdinalIgnoreCase);
    }

    public override int GetHashCode(IEnumerable<string> obj)
    {
        return obj.OrderBy(value => value, StringComparer.OrdinalIgnoreCase).Aggregate(0, (hashCode, value) => value == null ? hashCode :  hashCode ^ value.GetHashCode() + 33);
    }
}

class A
{
    public IEnumerable<string> StringCollection { get; set; }
}

IEnumerable<A> collection = // collection of A

var grouping = collection.GroupBy(obj => a.StringCollection, StringCollectionEqualityComparer.Default).ToList();

(ToList()は評価を強制するためのものです。 にブレークポイントがありますがStringCollectionEqualityComparer、残念ながら期待どおりに呼び出されません)

collectionこの愚かな方法でグループ化すると、実際に機能します。

var grouping = collection.GroupBy(obj => String.Join("|", obj.StringCollection));

残念ながら、明らかにそれは私が使いたいものではありません。

機能しないということは、結果が期待したものではないことを意味します(愚かな方法を使用すると、結果は正しいです)。

4

1 に答える 1

6

StringCollectionEqualityComparer.DefaultEqualityComparer<IEnumerable<string>>.Default後者は前者の基本クラスであるため、 はにアクセスするための有効な代替方法です。StringCollectionEqualityComparer代わりに、単純に を使用して のインスタンスを作成する必要がありますnew StringCollectionEqualityComparer()

于 2013-04-17T20:40:17.617 に答える