C#SortedList以字节数组为键

时间:2013-10-30 23:16:48

标签: c# arrays icomparer

我想比较在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());

3 个答案:

答案 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)