如何从 C# SortedSet 中获取元素

4

我对此很陌生,请见谅。

如果我发现项目存在,我想在c# sortedset中编辑该项目。 因此,我可以使用list.contains(value)并发现该值确实存在于列表中。 但是,如何将该项目从列表中取出? 这就是我所拥有的。 随着我的列表大小变得非常大,这变得非常缓慢,因此我猜想必须有比这更好的方法。

if (list.Contains(p))
{
     Person exists = list.First(person => person.Name.Equals(line[0]));
     // do something here to exists
}
else
{
    // just add the person to the list
}

这就是为什么C++标准库集合是我所知道的唯一设计良好的集合。我不知道为什么C#和Java没有从它们的查找方法中返回指向已找到元素的迭代器。也许我只是想找到一个元素,以便获取下一个最大的元素(是的,在代码中我确实需要这样做,并且在C++排序集合中很容易实现)。 - user334911
4个回答

3

请注意,SortedSet.TryGetValue() 方法不会删除任何项,它只会返回匹配的元素(如果有)。 - Mustafa Özçetin

2

对于.NET Framework版本低于4.7.2:

无法从SortedSetHashSet集合中获取元素(使用Contains方法或其他方式)。只能知道集合是否包含该元素。因为为了在集合中查找此元素,已经使用了此元素(将其传递给Contains方法),可以假定已经拥有此元素。

对于.NET Framework版本从4.7.2开始:

请参见此答案


1

您是否真的需要红黑树结构的SortedSet?如果您不需要排序,那么不应该使用它。您是否考虑过使用更适合(更快)按键获取项的HashSetDictionary

在您的情况下,您可能需要创建一个键等于人名的Dictionary实例,例如:

Dictionary<string, Person> list;

然后你可以通过名字获取个人,复杂度为O(1)

if(list.ContainsKey(line[0]))
{
    list[line[0]]...
}

甚至更好的是:

或者更好:

Person p;

if(list.TryGetValue(line[0], out p))
{
    p...
)

好吧,我想我不必把它们排序。排序很好,但如果它们没有被排序,我也能处理它们。如何通过键从哈希集中获取项目? - Matthew The Terrible
我刚刚意识到我可以使用这段代码,而且它快了很多很多。存在的人 = list.FirstOrDefault(person => person.Name == p.Name); 我不知道为什么我一直在使用Where。随着我的列表越来越大,它会不断地搜索更多的名称,这使得一切都变得非常缓慢...唉。 - Matthew The Terrible
1
@MatthewTheTerrible,:) 无论如何,你可以查看Dictionary - Kirill Polishchuk
1
哦,是的,我更喜欢你的做法。 - Matthew The Terrible
2
这并没有回答楼主最初的问题。 - DrKoch
显示剩余2条评论

0

你可能想考虑使用PowerCollections项目——它对标准泛型集合有很多有用的改进。


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