我想要一个将浮点数的键值对存储到整数的集合(浮点数是键)。然后我想找到数字最小的键值对。所以,我基本上想用最低关联的浮点键来获取 int 值。
也许一个让它们根据键排序并允许我对其进行索引以便在索引 0 处获取对象的集合是合适的?但是,我不确定从哪里开始寻找这个。
我想要一个将浮点数的键值对存储到整数的集合(浮点数是键)。然后我想找到数字最小的键值对。所以,我基本上想用最低关联的浮点键来获取 int 值。
也许一个让它们根据键排序并允许我对其进行索引以便在索引 0 处获取对象的集合是合适的?但是,我不确定从哪里开始寻找这个。
你可以试试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 个键值对填充常规字典来完成的(键被打乱,以便以随机顺序输入)。我然后:
在添加或索引时,SortedList 的速度大约是原来的两倍,但删除每个元素所需的时间大约是 1000 倍。