C# HashSet 中是否有相当于 Pop() 的方法?

6
如果我有一个非空的HashSet<T> items,是否有任何快捷方式可以替代以下两行代码:
T item = items.First(); // this can be any item, it does not have to be the first one
items.Remove(item);

我认为T item = items.Pop()是一个合适的函数,但它并不存在。

我知道,两行代码或编写扩展方法并没有什么大不了的,但我有点期望有一个内置的Pop()函数,它不依赖于First()

编辑:

由于First()存在一些混淆:我绝对不关心从HashSet中弹出哪个项目,因此items.Last()也可以满足我的需求。

关于使用First()的这种混淆是我所苦恼的:即使我已经进行了注释,读取代码也会导致假设必须使用First()(实际上不必如此)。

因此,我想知道是否有一种适当的方式,可以从HashSet中获取一些项目,并将其用于进一步使用,并且不会给人留下必须选择第一个或最后一个或任何项目的印象,而应该明确任何项目都可以在此时选择。


12
为什么无序容器会有有序的操作?如果您假设某个元素将是第一个,那么似乎您正在错误地使用容器。 - Matthew Watson
1
我不关心顺序,我只想从集合中获取一个项目并同时将其从集合中删除。它不一定是第一个,“First()”只是第一个方法,它只是从“items”中给了我一些项目。 - Sebastian Werk
4
“有没有这两行的快捷方式”- “不,没有”对您有用吗? - Fildor
1
也许除了 HashSet<T>,还有其他类型的集合更适合您的需求,为什么一开始要使用 HashSet 呢? - quadroid
1
如果你不喜欢使用 First(),则使用 ElementAt(0) 也是有同样的意义的。 - mrogal.ski
显示剩余7条评论
1个回答

5
这是一个优雅的解决方案(我使用了列表,但您也可以使用哈希集代替它):
class Program
{
    static void Main(string[] args)
    {
        List<object> items = new List<object>();
        //code to fill the list...
        object item = items.RemoveFirst();
    }
}

static class Extensions
{
    public static T RemoveFirst<T>(this ICollection<T> items)
    {
        T item = items.FirstOrDefault();
        if (item != null)
        {
            items.Remove(item);
        }
        return item;
    }
}

1
我知道,这并不重要,要么使用两行代码,要么编写一个扩展方法。因此,问题提问者已经考虑了使用扩展方法。 - Fildor
1
我认为考虑和实际行动之间存在差异,我错了吗? - Marco Salerno
@SebastianWerk,我认为你的问题不够清晰。 - Marco Salerno
1
你可以通过将其声明为 public static T RemoveFirst<T>(this ICollection<T> items) 并在整个过程中引用 T 来使这个扩展方法成为通用的。另外,也许值得指出的是,有几种像这样的方法被故意留出了核心,因为它们很容易编写,并且会不必要地污染命名空间。 - wardies
@wardies,我不想让它变得太复杂难懂,无论如何,为了正确的目的,我已经编辑了方法,改成了正确的方式^^ - Marco Salerno
显示剩余4条评论

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