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)开始,因为第一项不必复制到自身.这使得代码不那么明显了.
只是考虑创建一个新的列表,列表中的解决方案的老,你可以这样做:
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个数量级.我想这将取决于你的列表有多大!
另一种选择,类似于Frank的那个,但是使用了闭包.它比弗兰克的版本更快.
bool isEven = true;
var newList = list.Where(x => isEven = !isEven).ToList();
Run Code Online (Sandbox Code Playgroud)