当hashset.Count==1时,从哈希集合中获取元素。

17
如何从已知只包含一个元素的哈希集合中获取该元素?(无需迭代)
3个回答

24

你可以使用 Single()

var element = yourHashSet.Single();

2
但这是(一种)迭代的形式。 - H H
7
需要使用 LINQ,建议回答提供。 - Feri
2
参考这个答案,我建议使用.Single()而不是.First() -- 因为在哈希集中获取唯一的项目是本意。 - Astrid E.

0

我有一个 HashSet<object>,由于某种原因无法使用 [0].First() 进行访问。

虽然技术上是迭代,但我还是把它放在这里,以防其他遇到同样问题的人看到这篇文章。

foreach (var i in myHash){
    object o = i;
    break;
}

简单地开始迭代,然后立即终止迭代。


0

以上两个答案都是正确的。似乎访问 HashSet<T> 的唯一方法是通过它的枚举器。

话虽如此,不是所有的枚举器都是平等的。 如果您关心垃圾分配,最好使用 foreach 而不是 single。原因是 Linq 可能会调用 IEnumerable<T>.GetEnumerator(),它返回一个 IEnumerator<T>。这会装箱枚举器。

您可以通过调用 HashSet<T> 来避免这种情况,它将返回一个 HashSet.Enumerator。这是一个结构体,不会分配内存。

Randy Hall 的答案 已经这样做了(foreach 不使用 IEnumerable,而是直接调用该方法)。但是,如果您不想在代码中插入 foreach 循环,可以手动进行迭代。

var set = new HashSet<String>();
set.Add("foo");

using var enumerator = set.GetEnumerator();
enumerator.MoveNext();
var result = enumerator.Current;

Console.Writeline(result); // "foo"

请记住,对于计数不等于1的集合,这不能保证每次返回相同的元素。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接