在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;
}
}