2013-04-05 75 views
1

我有一個List<Tuple<string,long,byte[]>>,我想按字節數組的內容分組。按數組內容分組

有沒有簡單的方法來做到這一點與GroupBy和lambda?

理想情況下,我想在不創建中間數據結構(如保存數組元素的字符串)的情況下執行此操作。

+0

什麼是你希望直到結束?如果您將單個字節項目作爲關鍵字,那麼結果的其餘部分是什麼? – itsme86 2013-04-05 18:41:41

+0

我希望結束與列表中的項目按照該數組的內容分組。即如果數組相等,則它們在同一組中,否則它們處於不同的組中。 – soandos 2013-04-05 18:42:36

+0

您是否將數組的定義定義爲對同一個數組的引用,或者在不同數組中具有相同的字節?如果是後者,則需要爲'byte []'定義一個自定義的相等比較器。 – Servy 2013-04-05 18:43:26

回答

3

你可以做到這一點使用自定義IEqualityComparer<byte[]>(甚至更好,一般一個:IEqualityComparer<T[]>)執行:

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 2013-04-05 18:48:08

+0

正如我所說 - 這只是一個例子。 – MarcinJuraszek 2013-04-05 18:48:44

+0

好吧,OP不會知道你的GetHashCode方法不是很好,或者如何解決它;他只會測試一次或兩次,看到正確的輸出,並且再也不會碰它。 – Servy 2013-04-05 18:49:20