我读过这篇关于卡片改组的帖子,在许多改组和排序算法中你需要交换列表或数组中的两个项目.但优质高效的Swap方法是什么样的呢?
让我们说一个T[]
和一个List
.您如何才能最好地实现在这两个项目中交换两个项目的方法?
Swap(ref cards[i], ref cards[n]); // How is Swap implemented?
Marc Gravell.. 25
那么,你发布的代码(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(IListlist, int indexA, int indexB) { int tmp = list[indexA]; list[indexA] = list[indexB]; list[indexB] = tmp; }
(使这种通用变得微不足道) - 然而,在阵列上工作的原始"内联"版本(即不是方法)会更快.
那么,你发布的代码(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(IListlist, int indexA, int indexB) { int tmp = list[indexA]; list[indexA] = list[indexB]; list[indexB] = tmp; }
(使这种通用变得微不足道) - 然而,在阵列上工作的原始"内联"版本(即不是方法)会更快.