我想知道在执行foreach时从c#中删除List中元素的最佳方法是什么.
这是一个代码示例.首先,我创建一个包含一些元素的列表,然后删除一个:
List<int> foo = new List<int>();
foo.Add(1);
foo.Add(2);
foo.Add(3);
foreach (int i in foo)
{
if (i==2)
{
foo.Remove(i);
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行这个,我得到一个InvalidOperationException但如何以高效的方式解决这个问题?
das*_*ght 12
如果必须在枚举时删除条目,请向后移动列表,并删除需要删除的项目.
for (var i = foo.Count-1 ; i >= 0 ; i--) {
if (MustBeRemoved(foo[i])) {
foo.RemoveAt(i);
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,这是不是在您的文章,您知道需要删除的值的情况下需要.
我假设你的实际用例比你的用例更复杂.因此,让我们假设您实际上有一些适用于每个元素的条件,并且多个元素可以满足.我们称之为谓词.
List<T>公开一种RemoveAll允许您提供谓词的方法.然后删除与该谓词匹配的任何项.例如
Func<int, bool> isEven = i => i % 2 == 0;
List<int> ints = ...
ints.RemoveAll(item => isEven(item));
// ints will only contain odd numbers
Run Code Online (Sandbox Code Playgroud)
其他需要考虑的方法是在for循环中向后遍历列表并按索引删除,构建包含要删除的项目的第二个列表,然后在第二个列表中的第二个循环中,从第一个列表中删除项目.或者您可以编写一个查询来构造一个包含您希望保留的项目的新序列.
| 归档时间: |
|
| 查看次数: |
226 次 |
| 最近记录: |