C#:Swap方法的好/最佳实现

Svi*_*ish 10 c# sorting shuffle

我读过这篇关于卡片改组的帖子,在许多改组和排序算法中你需要交换列表或数组中的两个项目.但优质高效的Swap方法是什么样的呢?

让我们说一个T[]和一个List<T>.您如何才能最好地实现在这两个项目中交换两个项目的方法?

Swap(ref cards[i], ref cards[n]);   // How is Swap implemented?
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 25

那么,你发布的代码(ref cards[n])只能使用一个数组(而不是一个列表) - 但你会简单地使用(where foobar是两个值):

static void Swap(ref int foo, ref int bar) {
    int tmp = foo;
    foo = bar;
    bar = tmp;
}
Run Code Online (Sandbox Code Playgroud)

或者可能(如果你想要原子):

Interlocked.Exchange(ref foo, ref bar);
Run Code Online (Sandbox Code Playgroud)

就个人而言,我不认为我会打扰交换方法 - 只是直接做; 这意味着您可以使用(无论是列表还是数组):

int tmp = cards[n];
cards[n] = cards[i];
cards[i] = tmp;
Run Code Online (Sandbox Code Playgroud)

如果你真的想编写一个可以处理列表数组的交换方法,你必须做类似的事情:

static void Swap(IList<int> list, int indexA, int indexB)
{
    int tmp = list[indexA];
    list[indexA] = list[indexB];
    list[indexB] = tmp;
}
Run Code Online (Sandbox Code Playgroud)

(使这种通用变得微不足道) - 然而,在阵列上工作的原始"内联"版本(即不是方法)会更快.

  • 我假设JIT编译器将内联通用交换,因此我认为没有性能理由选择"内联"方法而不是通用扩展. (4认同)
  • 我知道这是一个非常古老的问题,但您是否可以详细说明为什么泛型方法比内联版本慢?这仍然准确吗? (2认同)

小智 6

11 年后,我们有了元组......

(foo, bar) = (bar, foo);
Run Code Online (Sandbox Code Playgroud)