我读了这个post about card shuffling在许多混洗和排序算法中,您需要交换列表或数组中的两个项目。但是,好的且高效的 Swap 方法是什么样的?
假设一个 T[]
和 List<T>
.您如何最好地实现一种方法来交换这两项中的两项?
Swap(ref cards[i], ref cards[n]); // How is Swap implemented?
最佳答案
好吧,您发布的代码 (ref cards[n]
) 只能使用数组(而不是列表)- 但您可以简单地使用 (where foo
> 和 bar
是两个值):
static void Swap(ref int foo, ref int bar) {
int tmp = foo;
foo = bar;
bar = tmp;
}
或者可能(如果你想要原子的):
Interlocked.Exchange(ref foo, ref bar);
不过,就我个人而言,我不认为我会为交换方法而烦恼——直接进行即可;这意味着您可以使用(对于列表或数组):
int tmp = cards[n];
cards[n] = cards[i];
cards[i] = tmp;
如果您真的想编写一个适用于列表或数组的交换方法,您必须执行如下操作:
static void Swap(IList<int> list, int indexA, int indexB)
{
int tmp = list[indexA];
list[indexA] = list[indexB];
list[indexB] = tmp;
}
(使这个通用化是微不足道的) - 然而,在数组上工作的原始“内联”版本(即不是方法)会更快。
关于C#:Swap 方法的良好/最佳实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/552731/