我不确定,为什么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
中有断点,但不幸的是,它们未被调用,正如预期的那样)
当我以这种 dumb 的方式对collection
进行分组时,它确实有效。
var grouping = collection.GroupBy(obj => String.Join("|", obj.StringCollection));
不幸的是,显然这不是我想要使用的东西。
通过不工作,我的意思是结果不是我期望的结果(使用愚蠢的方式,结果是正确的。)
答案 0 :(得分:6)
StringCollectionEqualityComparer.Default
是访问EqualityComparer<IEnumerable<string>>.Default
的有效替代方法,因为后者是前者的基类。您需要创建StringCollectionEqualityComparer
的实例,而只需使用new StringCollectionEqualityComparer()
。