FOREACH返回的对象顺序是否稳定?假设对同一个集合的两次迭代将以相同的顺序返回对象是否安全?显然,假设该集合没有以其他方式更改。简短的回答-是的。但是,很明显,集合中项目的顺序可能与插入时的顺序不同,这取决于集合的类型(例如字典)。但是每次使用foreach循环迭代单个未修改的集合时,您都会得到相同的结果。这取决于集合类型。对于大多数集合,答案是“是”。但是,这并不能保证。集合类型的文档应指定它是否存在,但在大多数情况下通常会忽略该细节。但是,如果它不稳定,如果文档没有提到它,那将是一个巨大的疏忽。你不能保证这一点,除非你知道你正在迭代的类的具体实现。具有定义的元素顺序的集合(例如List)将以稳定的顺序被枚举。对于对象状态没有改变的集合,元素很可能以相同的顺序返回,例如Dictionary,尽管规范不保证这一点。作为不存在的示例,您可以想象一个基于哈希表的字典实现,该哈希表异步压缩或调整表的大小。这样的实现不能保证稳定的迭代顺序。虽然对于所有内置集合以及可能任何理智的集合类的答案都是“是”,但文档并未对IEnumerable做出任何限制。因此,没有什么告诉我们每次迭代都必须稳定。我可以想象以下用例:foreach(intiinnewShuffler(1,2,3,4,5,6,7,8,9))Console.WriteLine(i);这可以实现为迭代产生不同排序的类。所以-如果您仍然想考虑奇怪的边缘情况,答案应该是“否”。通常元素将以相同的顺序返回,绝对不能保证。它完全取决于集合类的内部实现。例如,我可以看到一个专门设计用于以随机顺序返回元素的集合类的案例。简而言之,除非您知道集合类的内部实现,否则不要对顺序做任何假设。Linq为此目的定义了IOrderedEnumerable接口。关于“未修改”(NM的回复)——请注意,许多复杂的容器(如Dictionary)不能保证保持顺序。有时添加一个项目会使它出现在最后(给人以保留顺序的印象),有时它会导致内部桶重新组织,从而导致完全不同的顺序。SortedList之类的东西显然有自己的规则。我会说对于大多数收藏来说,可以安全地假设这一点。某个集合可能会以非确定性的方式实现investigator,但这可能不会发生……以??上是C#学习教程:FOREACH返回对象的顺序是否稳定?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
