1

我想要一个将浮点数的键值对存储到整数的集合(浮点数是键)。然后我想找到数字最小的键值对。所以,我基本上想用最低关联的浮点键来获取 int 值。

也许一个让它们根据键排序并允许我对其进行索引以便在索引 0 处获取对象的集合是合适的?但是,我不确定从哪里开始寻找这个。

4

2 回答 2

9

你可以试试SortedDictionary。如果你在上面调用 .Keys,你会得到一个排序好的键集合。然后,您可以使用 LINQ .First()函数获取集合中的第一个键,例如:

var mySortedDictionary = new SortedDictionary<float, int>();

// ...
// Add some values to dictionary
// ...

// Note, you will need the System.Linq namespace for First()
float firstKey = mySortedDictionary.Keys.First();
int firstValue = mySortedDictionary[firstKey];
// If you just need the value:
int firstValue2 = mySortedDictionary.Values.First();

如果您需要获取第一个或最后一个以外的键,则可以使用 LINQ .ToArray().ToList()函数返回可索引的数组或列表,如下所示:

float[] indexableKeys = mySortedDictionary.Keys.ToArray();
int[] indexableValues = mySortedDictionary.Values.ToArray();

此外,以下代码将遍历集合并按排序顺序为您提供所有 KeyValuePairs:

foreach (var pair in mySortedDictionary)
{
    int key = pair.Key;
    // Do stuff with key...
    object value = pair.Value;
    // Do stuff with value...
}

作为替代方案,您也可以使用索引的SortedList 。要使用它,您只需要以下代码:

var mySortedList = new SortedList<float, int>();
// ...
// Add some values to sortedlist
// ...
int firstValue = mySortedList.Values[0];

注意:我没有机会对其中任何一个进行基准测试,所以我不确定哪个会更好。使用排序集合肯定比常规集合具有更多开销。如果您只需要知道哪个键是第一个键,则最好创建一个自定义类,其中包含一个 Dictionary 和一个private float first;存储哪个键是第一个键的私有字段。当您添加到该类时,它会将 KeyValuePair 添加到字典并检查键是否小于您的first变量(或者字典中是否没有键)。如果是这样,它将设置first为新密钥。当您删除一个值时,您会再次将其从字典中删除。如果密钥等于您的first值,那么您需要对 Dictionary.Keys 集合进行排序并首先找到新的集合。这可能会表现最好,但您必须自己编写课程。

注意: 在做了一些基准测试后,我发现 SortedDictionary 的删除速度更快,但 SortedList 的添加和键索引更快。 这是通过用 1,000,000 个键值对填充常规字典来完成的(键被打乱,以便以随机顺序输入)。我然后:

  • 将这些对中的每一个添加到两个排序的集合中
  • 对两个排序集合中的每个键执行查找
  • 通过在两个排序集合上调用 Remove(Key) 删除每一对

在添加或索引时,SortedList 的速度大约是原来的两倍,但删除每个元素所需的时间大约是 1000 倍。

于 2012-06-08T14:32:12.330 回答
0

当然,您可以使用任何完全排序的数据结构。但是“完全排序”的部分当然会涉及一些开销。

如果只检索最低的键,那么“优先队列”通常是最好的数据结构。这里提出了一个适当的问题。

于 2012-06-08T14:39:06.077 回答