按IEnumerable <string>分组根本不起作用

mnn*_*mnn 0 c# linq grouping iequalitycomparer

我不太确定,为什么分组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();
Run Code Online (Sandbox Code Playgroud)

(ToList()是强制评估,我有断点StringCollectionEqualityComparer,但不幸的是,它们没有像预期的那样被调用)

当我collection以这种愚蠢的方式分组时,它确实有效.

var grouping = collection.GroupBy(obj => String.Join("|", obj.StringCollection));
Run Code Online (Sandbox Code Playgroud)

不幸的是,显然这不是我想要使用的东西.

如果不工作,我的意思是结果不是我期望的结果(使用愚蠢的方式,结果是正确的).

小智 6

StringCollectionEqualityComparer.Default是一种有效的替代访问方式EqualityComparer<IEnumerable<string>>.Default,因为后者是前者的基类.您需要创建一个实例,而StringCollectionEqualityComparer不仅仅是使用new StringCollectionEqualityComparer().

  • 很高兴它有所帮助,但它实际上与仿制药无关.基类的静态成员总是可以通过派生类型访问,这就是为什么看似不可见的代码,如`if(int.Equals(1.2,"wtf")){...}`有效:实际上调用`object.Equals (1.2,"wtf")`. (2认同)