当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《C#:Swap方法的好/最佳实现》经验,为你挑选了1个好方法。

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

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

Swap(ref cards[i], ref cards[n]);   // How is Swap implemented?

Marc Gravell.. 25

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

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 list, int indexA, int indexB)
{
    int tmp = list[indexA];
    list[indexA] = list[indexB];
    list[indexB] = tmp;
}

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



1> Marc Gravell..:

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

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 list, int indexA, int indexB)
{
    int tmp = list[indexA];
    list[indexA] = list[indexB];
    list[indexB] = tmp;
}

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


我假设JIT编译器将内联通用交换,因此我认为没有性能理由选择"内联"方法而不是通用扩展.
我知道这是一个非常古老的问题,但您是否可以详细说明为什么泛型方法比内联版本慢?这仍然准确吗?
推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有