如题。我知道它可能在删除的项目之前和之后合并 2 个子列表,但是在删除 LAST 元素时该方法的行为如何?换句话说:它是否以某种方式复制了位于删除索引之前的所有元素?我只是对在一个巨大的列表(假设 5000 个元素)上使用 RemoveRange 只是为了删除 f.e. 的性能感到好奇。只有最后 2 个。
如果它创建一个副本,是否有办法更改一些设置列表大小的内部变量(并将其余分配的元素视为垃圾)?
我只设法找到一个信息,它是一个 O(n) 复杂度算法,但我不确定这种情况下的“n”是列表大小还是要删除的项目数。
任何提示都会很高兴。
最佳答案
它会做的是在要删除的项目范围末尾之后取出每个项目,并在列表中将其向上移动所删除的项目数。就性能影响而言,在移动的项目范围结束后,每个项目都会有一个副本。这意味着它在从末尾移除时表现最佳(复杂度为 O(1)),而在从头移除时表现最差(复杂度为 O(n))。
例如,考虑以下列表:
index - value 0 - A 1 - B 2 - C 3 - D 4 - E 5 - F 6 - G
如果我们调用 RemoveRange(2, 2)
那么我们将删除从索引 2 开始的两项,因此我们将删除 C 和 D。
这意味着 E 需要复制到索引 2,然后 F 需要复制到索引 3,G 需要复制到索引 4。在删除最后一项后,每一项都有一个复制操作。
请注意,由于您可以将整个内存块“向上”移动两个,因此在实践中这最终比单独复制每个项目更有效。对于计算机内存来说,将整个内存块向上移动一些固定的字节数比将许多小的内存部分移动到不同的任意位置要容易得多。不过,它将具有相同的渐近复杂性。
关于c# - RemoveRange() 方法如何在 List<> 中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16064983/