HashSet<object> myHashSet = new HashSet<object>();
// Iteration 1
foreach (object myObject in myHashSet) { ... }
// Some instructions THAT DO NOT MODIFY myHashSet
...
// Iteration 2
foreach (object myObject in myHashSet) { ... }
myHashSet
的对象是否会在两次迭代中以相同的顺序被枚举?
最佳答案
根据 HashSet
( link ) 的引用资料,在没有集合修改的情况下,迭代顺序是可预测的。
public bool MoveNext() {
if (version != set.m_version) {
throw new InvalidOperationException(SR.GetString(SR.InvalidOperation_EnumFailedVersion));
}
while (index < set.m_lastIndex) {
if (set.m_slots[index].hashCode >= 0) {
current = set.m_slots[index].value;
index++;
return true;
}
index++;
}
index = set.m_lastIndex + 1;
current = default(T);
return false;
}
尽管不太可能,这可能会在 .NET 平台的 future 版本或其他实现中发生变化。为确保顺序保持不变,请在第一次迭代时从集合中创建一个列表,并在第二次迭代中使用该列表:
var myList = myHashSet.ToList();
foreach( var obj myObject in myList) ...
// Some instructions (may or may not modify myHashSet, it no longer matters)
foreach( var obj myObject in myList) ...
关于c# - 依赖于未修改的 HashSet 的迭代顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27065754/