如何正确使用c#中的SortedDictionary?

如何正确使用c#中的SortedDictionary?,c#,dictionary,sorted,sorteddictionary,C#,Dictionary,Sorted,Sorteddictionary,我正在尝试做一些非常简单的事情,但似乎我不理解SortedDictionary 我想做的是: 创建一个按浮点数对项目进行排序的已排序字典,因此我创建了一个如下所示的字典 SortedDictionary<float, Node<T>> allNodes = new SortedDictionary<float, Node<T>>(); SortedDictionary allNodes=new SortedDictionary(); 现在,在我

我正在尝试做一些非常简单的事情,但似乎我不理解
SortedDictionary

我想做的是:
创建一个按浮点数对项目进行排序的已排序字典,因此我创建了一个如下所示的字典

SortedDictionary<float, Node<T>> allNodes = new SortedDictionary<float, Node<T>>();
SortedDictionary allNodes=new SortedDictionary();
现在,在我添加项目之后,我想一个接一个地删除它们(每次删除的复杂性应该是O(log(n)),从最小到最大

我怎么做?我以为只要
allNodes[0]
就可以得到最小的节点,但事实并非如此

此外,字典似乎无法处理重复的键。我觉得我使用了错误的数据结构…
如果我有一堆节点,我想按它们的距离(浮点)排序,我应该使用其他方法吗?

因为
字典必须有唯一的键,我会使用
列表
。例如,如果你的
节点
类有一个
属性

class Node<T>
{
    float Value { get; set; }
    // other properties
}

allNodes[0]
不会为您提供字典中的第一项-它将为您提供键值为
0
浮动项

如果需要第一个项,请尝试使用
allNodes.Values.first()
。或者使用
allNodes.Keys.first()

要逐个删除项目,请循环查看
集合的副本,然后调用
所有节点。删除(键);

foreach (var key in allNodes.Keys.ToList())
{
    allNodes.Remove(key);
}
为了回答您的问题附录,yes
SortedDictionary
(任何类型的
字典
)将不会处理重复键-如果您尝试使用现有键添加项目,它将覆盖以前的值


您可以使用
SortedDictionary
,但这样您就有了提取集合和项目的复杂性,需要初始化每个列表,而不仅仅是添加一个项目,等等。这一切都是可能的,可能仍然是添加和获取的最快结构,但它确实增加了一点复杂性。

是的,关于复杂性,您是对的。

SortedDictionary
中,所有键都已排序。如果要从最小值迭代到最大值,
foreach
就足够了:

foreach(KeyValuePair<float, Node<T>> kvp in allNodes)
{
    // Do Something...
}
然后将所有内容放入简单的
列表中,列出所有节点
并排序:

allNodes.Sort(new NodeComparer());

字典键值必须是唯一的。我认为您应该使用列表,因为列表可能有重复的条目。然后使用LINQ将数据按您希望的顺序进行操作。您是只想根据每个节点具有的某个值对节点集合进行排序,还是需要使用
sortedAction的特定原因ary
?如果是前者,只需在开始收集时的任何集合上使用LINQ
OrderBy
。我想在O(Log(n))中插入和删除,我的大部分工作是插入和删除…哪个列表在O(n)中执行。对于您的问题:排序基于每个节点中的某个值。
foreach(KeyValuePair<float, Node<T>> kvp in allNodes)
{
    // Do Something...
}
public class NodeComparer : IComparer<Node>
{
    public int Compare(Node n1, Node n2)
    {
        return n2.dist.CompareTo(n1.dist);
    }
}
allNodes.Sort(new NodeComparer());