2013-04-05 1 views
1

나는 List<Tuple<string,long,byte[]>>을 가지고 있으며 바이트 배열의 내용으로 그룹화하려고합니다.배열 내용으로 그룹화

GroupBy과 람다로이 작업을 수행하는 간단한 방법이 있습니까?

이상적으로는 배열의 요소를 보유 할 문자열과 같은 중간 데이터 구조를 만들지 않고이 작업을 수행하고 싶습니다.

+0

? 개별 바이트 항목을 키로 얻은 경우 나머지 결과는 무엇입니까? – itsme86

+0

내 목록의 항목이 해당 배열의 내용으로 그룹화되기를 바랍니다. 나는. 배열이 같으면 동일한 그룹에 속하지만 배열이 다른 그룹에 속합니다. – soandos

+0

배열에 대한 동일성을 동일한 배열에 대한 참조 또는 서로 다른 배열에 같은 바이트를 갖는 것으로 정의하고 있습니까? 후자의 경우,'byte []'에 대한 커스텀 동등 비교자를 정의 할 필요가있다. – Servy

답변

3

당신은 달성 할 수 있습니다 (더 나은 또는 일반적인 하나 IEqualityComparer<T[]>) 사용자 정의 IEqualityComparer<byte[]> 사용하여 구현 :

class ArrayComparer<T> : IEqualityComparer<T[]> 
{ 
    public bool Equals(T[] x, T[] y) 
    { 
     return x.SequenceEqual(y); 
    } 

    public int GetHashCode(T[] obj) 
    { 
     return obj.Aggregate(string.Empty, (s, i) => s + i.GetHashCode(), s => s.GetHashCode()); 
    } 
} 

내가 GetHashCode 매우 잘 구현 될 수있는 확신 해요,하지만 그냥 예입니다!

사용법 : 당신이 결국 기대하고 무엇

var grouped = source.GroupBy(i => i.Item3, new ArrayComparer<byte>()) 
+0

이것은 매우 효율적인 해시 코드 생성 방법은 아니지만 작동합니다. – Servy

+0

제가 말했듯이, 그것은 단지 하나의 예입니다. – MarcinJuraszek

+0

OP가 GetHashCode 방법이 좋지 않거나 해결 방법을 알지 못할 가능성이 있습니다. 그는 단지 한두 번 시험해보고 올바른 결과를보고 다시 만지지 마십시오. – Servy