删除List <T>中的备用元素

abh*_*ash 18 c# generics collections

List<T>不使用占位符列表变量的情况下,删除备用(奇数索引或偶数索引)元素的最有效方法是什么?

如果您能提出每个答案的成本,我们将不胜感激.

我正在寻找一种有效的方法来做到这一点

提前致谢

Guf*_*ffa 27

如果您为删除的每个项目调用RemoveAt,您将移动大量数据.最有效的方法是将要保留的项目移动到一起,然后在最后删除未使用的项目:

int pos = 0;
for (int i = 0; i < values.Count; i += 2, pos++) {
    values[pos] = values[i];
}
values.RemoveRange(pos, values.Count - pos);
Run Code Online (Sandbox Code Playgroud)

编辑:
此方法将在15毫秒内处理一百万个整数的列表.使用RemoveAt将需要三分钟......

编辑2:
你实际上可以从pos = 1和i = 2(或3)开始,因为第一项不必复制到自身.这使得代码不那么明显了.


flq*_*flq 9

只是考虑创建一个新的列表,列表中的解决方案的,你可以这样做:

var newList = old.Where((_, i) => i%2 != 0).ToList();
Run Code Online (Sandbox Code Playgroud)

或者,显然

var newList = l.Where((_, i) => i%2 == 0).ToList();
Run Code Online (Sandbox Code Playgroud)

取决于您选择的替换.

编辑

答案要快得多.如果你在这里读到别的东西,那是因为我在一个周末和周末测量的大脑很有趣.:(关闭解决方案大约快40%,而答案是应用程序快2个数量级.我想这将取决于你的列表有多大!


Mar*_*náš 5

另一种选择,类似于Frank的那个,但是使用了闭包.它比弗兰克的版本更快.

bool isEven = true;            
var newList = list.Where(x => isEven = !isEven).ToList();
Run Code Online (Sandbox Code Playgroud)