我使用以下方法来调整我的字节数组,它工作得很好并且它保留了原始顺序的不足。 因为我想写一个去混乱的方法,它将物品返回到洗牌之前的相同顺序,为此我需要在洗牌之前记录下来,所以我做了以下
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();
}
我不确定它是否是最佳方式,但有人可以提出一种方法来避免创建元组或创建对象吗?
答案 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;
}