在C#HashSet中是否有Pop()等价物

在C#HashSet中是否有Pop()等价物,c#,C#,如果我有一个非空的HashSet 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() 编辑: 由于对F

如果我有一个非空的
HashSet 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()
在某种程度上是重要的(事实并非如此)


因此,为了澄清这一点:我想知道,是否有合适的方法,从
散列集
中提取一些项目,以供进一步使用,并且不要给人留下印象,它必须是第一个或最后一个项目或任何项目,但更清楚的是,任何项目都可能在此时被选中。

这是一个优雅的解决方案(我使用了list,但您可以将hashset替换为它):

类程序
{
静态void Main(字符串[]参数)
{
列表项=新列表();
//填充列表的代码。。。
对象项=items.RemoveFirst();
}
}
静态类扩展
{
public static T RemoveFirst(此ICollection项)
{
T item=items.FirstOrDefault();
如果(项!=null)
{
项目。移除(项目);
}
退货项目;
}
}

为什么一个无序的容器会有一个有序的操作?如果你假设某个元素将是第一个,那么听起来你是在滥用容器……我不关心排序,我只是想从集合中得到一个项目,同时将其从集合中删除。它不必是第一个,
first()
只是第一种方法,它只是从
项目中给了我一些项目。如果你需要索引,你不需要首先使用HashSet。请阅读jon的回答“这两行有快捷方式吗?”“没有,没有”这对你来说是一个有用的答案?也许其他类型的集合比HashSet更适合你的需要,为什么你首先要使用HashSet?从问题“我知道,两行都有或写一个扩展方法没什么大不了的”所以,OP已经考虑了一种扩展方法。我认为考虑和做之间有区别,我错了吗?扩展只有在支持
IEnumerable
时才有意义。我的观点是,使用
First()
FirstOrDefault()
会导致一些关于排序的假设(如下面问题的讨论中所述)。您可以将此扩展方法声明为
publicstatict RemoveFirst(此ICollection项),从而使其成为泛型
并通篇引用
T
。此外,也许值得指出的是,有几种类似的方法故意被排除在核心之外,因为它们编写起来很简单,并且会不必要地污染名称空间。
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;
    }
}