我想比较在SortedList
中用作键的字节数组public SortedList<byte[], string> myList = new SortedList<byte[], string>();
问题是,我无法将条目添加到myList中,因为.NET不知道如何比较列表中的两个元素(“错误比较数组中的两个元素”):
byte[] bytearray = {0,0,25,125,250}; // Example
string description = "Example Value";
myList.Add(bytearray, description);
经过一些谷歌搜索,我读到了一些关于实现我自己的IComparer类的内容。我进一步搜索但没有找到任何关于字节数组的IComparer实现。你知道如何做到这一点吗?
快速编辑: 谢谢你的回答!我从提供的答案中实现了IComparer:
class ByteComparer : IComparer<byte[]>
{
public int Compare(byte[] x, byte[] y)
{
var len = Math.Min(x.Length, y.Length);
for (var i = 0; i < len; i++)
{
var c = x[i].CompareTo(y[i]);
if (c != 0)
{
return c;
}
}
return x.Length.CompareTo(y.Length);
}
}
用以下方式调用它:
public SortedList<byte[], string> myList = new SortedList<byte[], string>(new ByteComparer());
答案 0 :(得分:3)
这样的事情怎么样?
class ByteComparer : IComparer<byte[]>
{
public int Compare(byte[] x, byte[] y)
{
var len = Math.Min(x.Length, y.Length);
for (var i = 0; i < len; i++)
{
var c = x[i].CompareTo(y[i]);
if (c != 0)
{
return c;
}
}
return x.Length.CompareTo(y.Length);
}
}
这甚至可以扩展为泛型类,用于比较实现IComparable<T>
的任何类型的数组:
class ArrayComparer<T> : IComparer<T[]>
where T : IComparable<T>
{
public int Compare(T[] x, T[] y)
{
var len = Math.Min(x.Length, y.Length);
for (var i = 0; i < len; i++)
{
var c = x[i].CompareTo(y[i]);
if (c != 0)
{
return c;
}
}
return x.Length.CompareTo(y.Length);
}
}
这将找到两个数组之间不同的第一个元素,并根据类型默认排序返回一个指示哪个首先出现的值。如果没有差异,它将返回一个值,指示哪个数组更短。
答案 1 :(得分:1)
您需要创建一个实现IComparer<byte[]>
接口的类。此接口有一个方法 - public int Compare(byte[] first, byte[] second)
。如果first < second
,该方法应返回负int,如果first == second
则返回0,如果first > second
则返回正int。您需要在应用程序中找出<
,==
和>
的含义,并相应地编写方法。
答案 2 :(得分:0)
这实际上取决于你的逻辑流程。它是什么意思byte array a
小于byte array b
?你应该比较什么?无论如何,你只需要实现一个简单的方法:int Compare(byte[] x, byte[] y)