ソートの話なんだけど、ちょっとご相談。
例えば以下のようなkey-valueペアがあったとする。
int[] key = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3};
int[] val = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
keyには同じ値が入る可能性があって、valは単なる順番を表してるだけ。
んで、やりたいことは基本的にはkeyを降順でソートすることなんだけど、
もし同じ値があった場合にどちらが先になるかはランダムにしたいわけ。
まず、これをLINQで解決した例を示しとく。
public static IEnumerable<int> OrderingDescending<T>(this IEnumerable<T> self, Random random)
{
IEnumerable<int> order = Enumerable.Range(0, self.Count());
Tuple<int, T>[] merge = new Tuple<int, T>[self.Count()];

for (int i = 0; i < self.Count(); i++)
{
merge[i] = Tuple.Create(Enumerable.ElementAt(order, i), Enumerable.ElementAt(self, i));
}

return merge.OrderByDescending(tuple => tuple.Item2).ThenBy(tuple => random.Next()).Select(tuple => tuple.Item1);
}
【サンプルコード】
Random random = new Random(0);
val = key.OrderingDescending(random).ToArray();
Console.WriteLine(val.ToStringExtension());
random = new Random(1);
val = key.OrderingDescending(random).ToArray();
Console.WriteLine(val.ToStringExtension());
【実行結果】
{ 5 7 4 8 2 9 0 6 3 1 }
{ 5 7 8 4 2 0 9 6 1 3 }
ちなみにソートされたkeyは
{ 9 6 5 5 4 3 3 2 1 1 }