C# - 交换没有占位符的对象

时间:2011-05-20 07:36:03

标签: c#

有人告诉我,使用临时对象并不是交换数组中元素的最有效方法。

如:

Object[] objects = new Object[10];
// -- Assign the 10 objects some values
var Temp = objects[2];
objects[2] = objects[4];
objects[4] = Temp;

是否真的可以在不使用其他对象的情况下交换数组元素?

我知道你可以使用数学单元,但我无法弄清楚如何使用任何其他对象类型完成。

5 个答案:

答案 0 :(得分:6)

使用临时交换对象是最正确的方法。这应该比你的优先级更高,而不是速度。编写快速输出垃圾的软件非常容易。

在处理对象时,你不能以不同的方式做到这一点。这根本不是低效的。指向已存在对象的额外引用变量几乎不会成为问题。

但即使使用数值,大多数聪明的技术都无法在某些时候产生正确的结果。

答案 1 :(得分:2)

可能是可能告诉你这个人正在考虑这样的事情:

objects[2] = Interlocked.Exchange(ref objects[4], objects[2]);

当然,仅仅因为这是一行并不意味着它不是使用临时变量。它只是以方法参数的形式隐藏(对objects[2]的引用被复制并传递给Exchange方法),使其不太明显。

答案 2 :(得分:1)

你可以用Interlocked.Exchange做到这一点,但这不会比使用临时变量更快......并不是说速度可能对于面试之外的这种问题很重要。

答案 3 :(得分:0)

我在网上找到的每个例子都使用这种方法来交换数组中的2个元素。事实上,如果这是我经常做的事情,我肯定会考虑一种通用的扩展方法,类似于这个例子:

http://w3mentor.com/learn/asp-dot-net-c-sharp/c-collections-and-generics/generically-swapping-two-elements-in-array-using-ccsharp/

答案 4 :(得分:0)

你应该担心创建一个临时对象的唯一时间是它的大量,并且复制对象所花费的时间将足够长,如果你做了很多,例如,或者如果你正在进行排序10k项目,并将它从9999移动到1,1阶段,一次测试它是否应该移动,然后每次交换它将是一个消耗。但是,更有效的方法是测试所有测试并移动一次。