C# 使用HashSet删除项目范围
我正在使用哈希集 我正在寻找一种从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) );
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)