在改组数组之前保留indecies

时间:2014-01-04 08:51:03

标签: c#

我使用以下方法来调整我的字节数组,它工作得很好并且它保留了原始顺序的不足。 因为我想写一个去混乱的方法,它将物品返回到洗牌之前的相同顺序,为此我需要在洗牌之前记录下来,所以我做了以下

public static Random rnd=new Random();
public static void Shuffle(this byte[] Bytes,out int[] indecies)
{
    var list = Bytes.Select((b, i) => new Tuple<int, byte>(i, b)).ToArray();
    int n = list.Length;
    while (n > 1)
    {
        n--;
        int k = rnd.Next(n + 1);
        Tuple<int, byte> value = list[k];
        list[k] = list[n];
        list[n] = value;
    }

    Bytes = list.Select(tuple => tuple.Item2).ToArray();
    indecies = list.Select(tuple => tuple.Item1).ToArray();
}

我不确定它是否是最佳方式,但有人可以提出一种方法来避免创建元组或创建对象吗?

2 个答案:

答案 0 :(得分:1)

为什么不简单地创建另一个洗牌数组,并保留原始数组?即使保留整数索引数组也会占用更少的内存。

public static byte[] ToShuffledArray(this byte[] bytes)
{
    return bytes.OrderBy(b => rnd.Next()).ToArray();
}

用法:

byte[] array = { 1, 2, 3, 4, 5 };
byte[] shuffledArray = array.ToShuffledArray();

没有输出参数,没有整数索引数组。

答案 1 :(得分:0)

如果有人想要c方式,那么它就是

        var indecies =new byte[Bytes.Length];
        for (byte i = 0; i < Bytes.Length; i++)
        {
            indecies[i] = i;
        }
        int n = Bytes.Length;
        while (n > 1)
        {
            n--;
            int k = ThreadSafeRandom.ThisThreadsRandom.Next(n + 1);
            byte value = Bytes[k];
            byte index = indecies[k];
            Bytes[k] = Bytes[n];
            indecies[k] = indecies[n];
            Bytes[n] = value;
            indecies[n] = index;
        }