【问题标题】:Keep iterating through HashSet while items are being added and removed在添加和删除项目时继续遍历 HashSet
【发布时间】:2015-12-16 21:00:28
【问题描述】:

如何在添加和删除项目时遍历 HashSet? 请记住,在实际程序中,有时不会将任何内容添加到列表中,因此列表有一个结束,它不是无限循环。

例如:

static HashSet<int> listThingy = new HashSet<int>() { 1, 2 } ;

static void Main(string[] args)
{
    foreach (var item in listThingy)
    {
        listThingy.Add(3);
        listThingy.Remove(item);
        Console.WriteLine(item);
    }
}

输出应该是这样的:

1
2
3
3
3
3
3
3
etc..

在程序中,我将向列表中添加随机值(有时不会添加任何内容),直到处理完所有值。

【问题讨论】:

  • 不要使用 HashSet。你似乎需要一个队列。
  • HashSet 的元素没有排序。 IE。最后不会添加新元素,并且循环将以不可预测的顺序生成元素。因此这个循环不能工作。

标签: c# .net list hashset


【解决方案1】:

最接近你描述的是:

static ConcurrentDictionary<int, object> listThingy = new ConcurrentDictionary<int, object>();

static void Main(string[] args)
{
    listThingy.Add(1, null);
    listThingy.Add(2, null);
    foreach (var item in listThingy)
    {
        object val = null;
        listThingy.TryAdd(3, null);
        listThingy.TryRemove(2, val);
        Console.WriteLine(item);
    }
}

【讨论】:

  • 这不会提供所述功能。添加的对象可能最终位于字典的迭代器已经通过的存储桶中,因此不会屈服于foreach
  • 问:“如何在添加和删除项目时遍历 HashSet?”提问的人没有意识到 List 和 HashSet 之间的区别,所以他认为新项目是在 HashSet 的末尾添加的,而 HashSet 没有“结束”。你通过投票来促进这种无知。感谢您让事情变得更糟。
  • 我知道这一点。您发布了一个无法实现这一目标的解决方案。代码编译了,它不会抛出异常,但它也不起作用。
  • 在添加和删除项目时代码通过“HashSet”迭代是事实。这是对所提出的问题的确切答案。询问的人只是对 HashSet 的行为有错误的期望。
  • 该问题明确指出,它希望所述迭代合并循环期间所做的更改。这不这样做。您似乎阅读了标题,而不是具体解释了为什么此解决方案不起作用的问题正文。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-27
  • 1970-01-01
  • 2021-03-08
  • 2010-12-01
  • 1970-01-01
  • 2017-08-09
  • 2014-04-12
相关资源
最近更新 更多