2014-02-20 92 views
0

我創建像這樣的列表:C#排序列表不起作用

private List<byte[]> shaList = new List<byte[]>(); 

,並與數以百萬計的SHA的填充。 後來我想那種像這樣:

shaList.Sort(); 

但它拋出一個異常:

Unbehandelte Ausnahme: System.InvalidOperationException: Fehler beim Vergleichen 
von zwei Elementen im Array. ---> System.ArgumentException: Mindestens ein 
Objekt muss IComparable implementieren. 
bei System.Collections.Comparer.Compare(Object a, Object b) 
bei System.Collections.Generic.ObjectComparer`1.Compare(T x, T y) 
bei System.Collections.Generic.ArraySortHelper`1.SwapIfGreaterWithItems(T[] 
keys, IComparer`1 comparer, Int32 a, Int32 b) 
bei System.Collections.Generic.ArraySortHelper`1.QuickSort(T[] keys, Int32 
left, Int32 right, IComparer`1 comparer) 
bei System.Collections.Generic.ArraySortHelper`1.Sort(T[] keys, Int32 index, 
Int32 length, IComparer`1 comparer) 
--- Ende der internen Ausnahmestapelüberwachung --- 
bei System.Collections.Generic.ArraySortHelper`1.Sort(T[] keys, Int32 index, 
Int32 length, IComparer`1 comparer) 
bei System.Array.Sort[T](T[] array, Int32 index, Int32 length, IComparer`1 
comparer) 
bei System.Collections.Generic.List`1.Sort(Int32 index, Int32 count, I 
Comparer`1 comparer) 
bei System.Collections.Generic.List`1.Sort() 

我沒有做一個線索如何對我自己進行排序。我只用了泡泡和插入排序在學校,但與冒泡排序排序數以百萬計的散列...的xD

// 3vilc00kie

+2

您可以[]',但排序'字節怎麼辦要排序的'的byte []'名單?哪個數組最先出現,哪個最後? –

回答

3

您可以實現自定義比較:

class ByteArrayComparer : IComparer<byte[]> { 
    public int Compare(byte[] x, byte[] y) { 
     // implement your comparison criteria here 
    } 
} 

然後排序列表如下:

List<byte[]> shaList = new List<byte[]>(); 
shaList.Sort(new ByteArrayComparer()); 

什麼你比較函數應該返回的定義如下:http://msdn.microsoft.com/en-us/library/xh5ks3b3(v=vs.110).aspx

Ba sically,你必須返回:

  • < 0,如果x <Ÿ
  • 0如果x ==Ÿ
  • > 0,如果X> Y
+0

好的,比較函數的返回值是多少?如果x大於y?像C中的strcmp? –

1

你得到的異常,因爲你正在試圖理清使用字節數組列表。由於字節[]沒有實現IComparable你不能做到這一點

1
list.OrderBy(b => BitConverter.ToInt64(b, 0)) 
0

您可以排序byte[]但如何你想排序一個List<Byte()>?哪個數組最先出現,哪個最後? Y

下面是一個使用List.Sort的過載的示例,它需要Comparison<T>。它比較所有字節的總和。

shaList.Sort((b1, b2) => b1.Sum(b => b).CompareTo(b2.Sum(b => b))); 
1

尚不清楚你想要什麼,但也許這:

shaList.Sort(System.Collections.StructuralComparisons.StructuralComparer.Compare); 

StructuralComparisons是.NET版本4.0(2010年)推出了static class。它的屬性StructuralComparer給出了一個「按結構」進行比較的對象,該對象在數組(或元組)中的每個條目後按字典順序排列。它通過方法Compare來完成;以上,Compare通過方法組轉換轉換爲委託。

重要附加:這似乎只適用於如果列表中的所有字節數組具有相同的長度。

測試代碼:

static void Main() 
{ 
    var shaList = new List<byte[]> 
    { 
     new byte[] { 20, 29, }, 
     new byte[] { 22, 29, }, 
     new byte[] { 2, 255, }, 
     new byte[] { 22, 0, }, 
    }; 

    shaList.Sort(System.Collections.StructuralComparisons.StructuralComparer.Compare); 
} 
+0

所有的沙發都有相同的長度... 我會試試這個,因爲這是最簡單的解決方案。 希望它在性能上不缺 –

+0

@RaphiPour對我而言,還不清楚你想要什麼。排序[SHA](http://en.wikipedia.org/wiki/SHA-2)是否有意義,我不確定?我希望這個表現非常好。 'List <>。Sort'做了一個快速的in-place排序(確切的算法略微依賴於.NET版本),並且在大多數情況下,我認爲'StructuralComparer'將只需要看看沒有比這兩個它正在比較的數組。 –

0

Array.Sort()可以接受的IComparer<T>接口實現或Comparison<T>委託。無論哪種情況,如Paolo Tedesco所述,您必須編寫一個接受兩個字節數組並返回數字比較結果的函數。

這裏是一個簡潔的實現,有效地做到這一點:

int CompareByteArrays(byte[] a, byte[] b) 
{ 
    var length = Math.Min(a.Length, b.Length); 
    for (var i = 0; i < length; i++) 
    { 
     var diff = a[i] - b[i]; 
     if (diff != 0) 
      return diff; 
    } 
    return a.Length - b.Length; 
}