如何从已知只包含一个元素的哈希集合中获取该元素?(无需迭代)
我有一个 HashSet<object>
,由于某种原因无法使用 [0]
或 .First()
进行访问。
虽然技术上是迭代,但我还是把它放在这里,以防其他遇到同样问题的人看到这篇文章。
foreach (var i in myHash){
object o = i;
break;
}
简单地开始迭代,然后立即终止迭代。
以上两个答案都是正确的。似乎访问 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"
.Single()
而不是.First()
-- 因为在哈希集中获取唯一的项目是本意。 - Astrid E.