C# 使用HashSet删除项目范围

C# 使用HashSet删除项目范围,c#,hashset,C#,Hashset,我正在使用哈希集 我正在寻找一种从HashSet开始删除一系列项的方法 使用List可以使用RemoveRange 示例 从开头删除10项: dinosaurs.RemoveRange(0, 10); 这可以用HashSet完成吗 [Edit]哈希集的顺序无关紧要,因为它只包含随机字符串。您可以使用LINQ并将结果传递给哈希集构造函数: var filteredList = new HashSet<Dinosaur> ( originalList.Skip(10) );

我正在使用哈希集

我正在寻找一种从HashSet开始删除一系列项的方法

使用
List
可以使用
RemoveRange

示例

从开头删除10项:

dinosaurs.RemoveRange(0, 10);
这可以用HashSet完成吗


[Edit]哈希集的顺序无关紧要,因为它只包含随机字符串。

您可以使用LINQ并将结果传递给哈希集构造函数:

var filteredList = new HashSet<Dinosaur>
(
    originalList.Skip(10)
);
var filteredList=new HashSet
(
原始列表。跳过(10)
);
正如Servy所指出的,哈希集可能没有顺序,因此在跳过10之前,您可能希望获得一个有序的枚举

var filteredList = new HashSet<Dinosaur>
(
    originalList
        .OrderBy( x => x.Foo )
        .Skip(10)
);
var filteredList=new HashSet
(
原创作家
.OrderBy(x=>x.Foo)
.Skip(10)
);

如果你不想实例化一个新的HashSet(即,你想从现有实例中删除项),你需要一个接一个地这样做。

HashSet
存储独特的数据片段(在引擎盖下,存储与
字典中存储的键相同),因此删除“第一个”没有多大意义10个项目,因为它们实际上是随机排序的,但对于大多数需求来说实际上不是随机的

如果您需要以更合适的方式对其进行随机排序,
OrderBy
可以这样做:

var r = new Random();
foreach(var dinoToRemove in dinosaurs
    .OrderBy(x => r.Next())
    .Take(10))
{
    dinosaurs.Remove(dinoToRemove);
}
如果您真的决定删除前十个,还可以使用带有
removehere

var count = 0;
dinosaurs.RemoveWhere(x => count++ < 10);
var计数=0;
恐龙.RemoveWhere(x=>count++<10);

哈希集中的项是无序的,因此对于该数据结构而言,索引或项序列的想法是毫无意义的。否-您必须一次删除一个。在查看MSDN中的文档时,哈希集中唯一可用的删除多个项的函数是RemoveWhere(谓词匹配)。如果恐龙具有某些属性(例如大小),则可以使用RemoveWhere(例如恐龙.RemoveWhere(d=>d.size>6))删除多个项目。但是HashSet不支持删除一系列项。谢谢,我最后使用了队列。若队列超过允许的数量,则删除第一个元素。不是远程的,但足够好了。考虑使用“代替Dror”。我不关心订单,它只是一个随机数据的杂凑:无论如何,这是一个很好的答案。在这种情况下,你可能想要使用一个列表,因为用队列计算这些数据有一个(小的)性能开销。但如果有人需要,你的答案确实解决了这个问题。是的,
List
可用于远程删除。只是想要性能,但有时性能会以灵活性为代价。为什么
count++<10
有效?它以某种方式将变量名“count”转换为每个成员的
count
属性?正如我所说,这将删除前十个成员,因此我捕获在lambda之外声明的
count
,实际上并不关心
x
中的内容。这也比使用
Skip(10)