2014-02-20 77 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; 
}