IEnumerable<string>
그룹화가 작동하지 않는 이유는 확실하지 않습니다. 물론 사용자 정의 IEqualityComparer를 제공합니다.IEnumerable에 의한 그룹화 <string>이 전혀 작동하지 않습니다.
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));
불행하게도, 분명히 내가 사용하고자하는 것이 아닙니다.
작동하지 않는 것은 예상 한 결과가 아니라는 것을 의미합니다 (바보 같은 방식으로 결과가 정확함).
고마워요! 제네릭과이 "문제"에 관해서 할 일을 좀 더 배우는 것처럼 보입니다. 이제는 내 맞춤'EqualityComparer'가 실패한 이유를 알고 있습니다. – mnn
다행히도 도움이되었지만 사실 제네릭과 관련이 없습니다. 기본 클래스의 정적 멤버는 파생 된 형식을 통해 항상 액세스 할 수 있습니다. 그 이유는 'if (int.Equals (1.2, "wtf")) {...} "와 같이 인식 할 수없는 코드가 실제로 유효하기 때문입니다. 즉, 실제로'object.Equals (1.2, "wtf"). – hvd
설명해 주셔서 감사합니다. .NET Framework의 저급 부분을 이미 알고 있다고 믿었습니다. 다음에, 나는 아무것도 가정하지 않을 것이다. – mnn