1

我有一个List<byte[]>. 每个字节数组的大小为 16 字节。前 8 个字节是 C# long 数据类型的二进制表示,我用它来停止 DateTimeTicks。我想知道是否有一种方法可以按相同的顺序对一堆字节数组进行排序,就像我按长等价物按升序排序一样。显然,如果将每个字节数组反序列化为 long 然后排序,这很容易,但是有没有办法在不反序列化的情况下逃脱?如果不是,是否有可能找到将 DateTimeTick 值转换为二进制表示的逻辑,以便可以直接对二进制执行排序,例如,首先以二进制形式表示年,然后是月、日、小时、分钟,秒,毫秒,.. ? 我的目标是跳过反序列化步骤,因为我需要通过消息传递网络以二进制格式发送已排序的字节数组,并且它目前浪费大量资源必须首先反序列化以进行排序(必须在发送对象之前完成排序通过网络),然后再次序列化它以通过消息传递系统发送它,然后再次反序列化它。

非常欢迎任何想法、提示或解决方案,谢谢。

编辑:我目前使用 Linq OrderBy 函数来排序,这对于我的目的来说足够快,并且看起来沿着这些线,性能明智。我想坚持使用 Linq,除非无法按字节数组排序,即使我提供了 IComparer ...

4

1 回答 1

2
        var rnd = new Random();

        var data = new List<byte[]>();

        //As long as the first 8 bytes are the long, the byte[] can be as long as you want.
        for (int i = 0; i < 10; i++)
            data.Add(BitConverter.GetBytes((ulong)rnd.Next()));

        //Without any 'deserialisation'
        if (BitConverter.IsLittleEndian)
            data = data.OrderBy(x => x[7]).ThenBy(x => x[6]).ThenBy(x => x[5]).ThenBy(x => x[4]).ThenBy(x => x[3]).ThenBy(x => x[2]).ThenBy(x => x[1]).ThenBy(x => x[0]).ToList();
        else  //untested, probably wrong
            data = data.OrderBy(x => x[0]).ThenBy(x => x[1]).ThenBy(x => x[2]).ThenBy(x => x[3]).ThenBy(x => x[4]).ThenBy(x => x[5]).ThenBy(x => x[6]).ThenBy(x => x[7]).ToList();

        //How I'd actually approach it due to simplicity.
        //data = data.OrderBy(x => BitConverter.ToUInt64(x, 0)).ToList();

        data.ForEach(x => Console.WriteLine(BitConverter.ToUInt64(x, 0)));

        Console.ReadLine();

        //There are other approaches of course, but at the fundamental level you're 
        //either going to 'deserialize' the long or test each byte in order.
于 2012-07-16T03:44:01.990 回答