排序字节列表或字节数组列表

时间:2015-05-24 10:49:57

标签: c# arrays linq sorting byte

LINQ在ThenBy等方面具有出色的OrderBy功能,但是我如何才能在List<List<byte>>上对第一列进行排序,然后按第二列进行排序,依此类推。

字节列表列表:

[0] = {0, 1, 2, 3, 4}
[1] = {0, 0, 2, 4, 1}
[2] = {1, 2, 2, 1, 1}
[3] = {1, 0, 2, 2, 2}

实际上,当我创建string []时,我做了同样的事情,但是将字节转换为字符串然后返回是混乱的,结果因某种原因而有所不同。

我想得到:

[0] = {0, 0, 2, 4, 1}
[1] = {0, 1, 2, 3, 4}
[2] = {1, 0, 2, 2, 2}
[3] = {1, 2, 2, 1, 1}

是否可以使用某些LINQ或任何其他已经制作的库来执行此操作,或者可能有任何建议如何手动创建它?

3 个答案:

答案 0 :(得分:9)

您可以从实施IComparer<IList<byte>>开始。例如。 (为简洁起见省略空处理):

public class ByteListComparer : IComparer<IList<byte>>
{
    public int Compare(IList<byte> x, IList<byte> y)
    {
        int result;
        for(int index = 0; index<Min(x.Count, y.Count); index++)
        {
            result = x[index].CompareTo(y[index]);
            if (result != 0) return result;
        }
        return x.Count.CompareTo(y.Count);
    }
}

以上是未经测试的(甚至没有编译过),但应该足以让你入门。

然后,您可以在主列表中使用OrderBy,传入此比较器的实例:

input.OrderBy(x => x, new ByteListComparer())

答案 1 :(得分:1)

顺便说一下,在标记答案中有这样的行

for(int index = 0; index < Math.Min(x.Count, y.Count); index++)

所以,功能

Math.Min(x.Count, y.Count)
迭代会持续多次调用

必须

int min=Math.Min(x.Count, y.Count);
for(int index = 0; index < min; index++)

答案 2 :(得分:0)

这种方法也可以。但@Joe表现出更好的表现方式。

public static void Main()
{
    List<List<Byte>> bytes = new List<List<Byte>>(){
                                        new List<Byte> {0, 1, 2, 3, 4},
                                        new List<Byte> {0, 0, 2, 4, 1},
                                        new List<Byte> {1, 2, 2, 1, 1},
                                        new List<Byte> {1, 0, 2, 2, 2}
                                };

    var result = bytes.OrderBy(x => String.Join(String.Empty, x));

    foreach (var list in result)
    {
        foreach (var bit in list)
            Console.Write(bit);

        Console.WriteLine();
    }   
}

https://dotnetfiddle.net/B8kmZX