c# - 依赖于未修改的 HashSet 的迭代顺序

标签 c# mono ienumerable hashset

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/

相关文章:

c# - 根 Android shell 使用 Runtime().Exec ("command"卡在 ReadLine() 上)

c# - 获取声明类的名称?

c# - 通过 AutoFixture 使用私有(private) setter 测试数据填充公共(public)属性

apache - 如何在运行 Apache2 的单个虚拟主机上托管多个 MVC3 站点?

c# - Roslyn 是跨平台的吗?

c# - BitmapImage.ImageOpened 未触发

c# - 在 Mac 上使用 C#/Mono 的仅系统托盘(无停靠图标)应用程序

c# - 使用 List<Person> Distinct() 返回 2 个值

c# - 按搜索字符串字母顺序 LINQ 开头的名称排序

c# - 在 NSubstitute 中使用 IEnumerable 设置参数匹配器