我正在寻找一个更好的模式来处理每个需要处理的元素列表,然后根据结果从列表中删除.
你不能.Remove(element)在里面使用foreach (var element in X)(因为它导致Collection was modified; enumeration operation may not execute.异常)...你也不能使用for (int i = 0; i < elements.Count(); i++),.RemoveAt(i)因为它会扰乱你在集合中的当前位置i.
有一种优雅的方式来做到这一点?
我知道.net集合类型(或至少一些集合类型)不允许在迭代时修改集合.
例如,在List类中存在如下代码:
if (this.version != this.list._version)
ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EnumFailedVersion);
Run Code Online (Sandbox Code Playgroud)
但显然这是设计迭代器类的开发人员的决定,因为我可以提供一些实现IEnumerable,至少在修改底层集合时不抛出任何异常.
然后我有一些问题:
为什么我在迭代时不应修改集合?
可以创建一个支持在迭代时修改的集合,而不会有任何其他问题吗?(注意:第一个答案也可以回答这个问题)
当C#编译器生成Enumerator接口实现时考虑到这样的事情?