1

私はList<byte[]>. 各バイト配列のサイズは 16 バイトです。最初の 8 バイトは、DateTimeTicks を停止するために使用する C# long データ型のバイナリ表現です。長い同等のものを昇順でソートした場合と同じ順序で一連のバイト配列をソートする方法があるかどうか疑問に思います。各バイト配列が long にデシリアライズされてからソートされた場合、明らかに簡単ですが、デシリアライズせずに逃げる方法はありますか? そうでない場合は、DateTimeTick 値をバイナリ表現に変換するロジックを見つけて、たとえば最初に年をバイナリ形式で表現し、次に月、日、時、分、秒、ミリ秒、.. ? 私の目標は、ソートされたバイト配列をメッセージングネットワーク経由でバイナリ形式で送信する必要があり、現在、ソートのために最初に逆シリアル化する必要があるために多くのリソースを浪費しているため、逆シリアル化ステップをスキップすることです (オブジェクトを送信する前にソートを行う必要があります)ネットワーク上で)、再度シリアライズしてメッセージング システム経由で送信し、再度デシリアライズします。

アイデア、ヒント、解決策は大歓迎です。ありがとうございます。

編集:私は現在、Linq OrderBy 関数を使用して、目的に十分な速度で並べ替えを行い、パフォーマンスに関して、それらの線に沿って何かを調べています。IComparerを提供したとしても、バイト配列で注文できない場合を除き、Linqに固執したいと思います...

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 に答える