如何在字典的第一个索引中插入元素
本文关键字:索引 插入 元素 第一个 字典 | 更新日期: 2023-09-27 18:19:34
是否有一种方法或技术允许您将元素插入到 Dictionary<TKey, TValue>
保证该项目位于该字典的 KeyCollection 的第一个索引中。
例如:
Dictionary<String, String> dic = foo.GetOutput();
// `dic` is something like:
// {"foo", "baa"},
// {"a", "b"}
我需要这样的东西:
dic.Add("key", "value", 0);
// where `0` is the index that `key` to be inserted.
foreach(KeyValuePair<String, String> key in dic)
{
Console.WriteLine("{0} = {1}", key.Key, key.Value);
}
输出:
key = value
foo = baa
a = b
不使用字典。
Dictionary<TKey, TValue>
是作为哈希表实现的。字典内部键的位置取决于哈希代码、进一步减少哈希代码以提供其内部结构索引的方法,以及以完全依赖于实现的方式插入顺序。
这不是实现字典的唯一方法。 SortedDictionary<TKey, TValue>
内部使用树结构,因此始终保持键顺序。在这种情况下,我们仍然无法在开始时插入一些东西,而是插入一些东西并将其放在适当的位置。
如果排序是你最关心的,那么你根本不想要一个纯词典。相反,您需要一个List<KeyValuePair<TKey, TValue>>
,或者您想要一个同时提供列表和字典功能的结构,由 OrderedDictionary
提供。这不是泛型的,但你可以轻松地围绕它创建一个泛型包装器(不会提供内部使用泛型的性能优势,但确实在使用中提供类型安全(。
这是一个三年前的问题。但是找到了解决此问题的方法。它可能会帮助某人
Dictionary<String, String> dic = foo.GetOutput();
dic = (new Dictionary<string, string> {{"key","value"}}).Concat(dic).ToDictionary(k => k.Key, v => v.Value);
这会将元素插入字典的开头:)
字典是无序的;元素应该使用键进行检索,键的哈希指向其值的位置。
您可能想要的是一个List <KeyValuePair>
,其元素可以插入到特定的索引中。
List<KeyValuePair<string, string>> list = dic.ToList();
list.Insert(0, new KeyValuePair<string, string>("a", "b"));
foreach(KeyValuePair<string, string> pair in list)
Console.WriteLine("{0} = {1}", pair.Key, pair.Value);
在Dictionary<TKey, TValue>
是不可能的,因为它在枚举时以无序方式呈现其值。 有SortedDictionary<TKey, TValue>
提供排序,但它直接对键值使用IComparer<TKey>
来实现。 在这里,您希望密钥是String
,并具有基于int
的排序。 这两种类型都是不可能的。
我认为您需要实现一种具有这些非常具体的语义的新类型。 例如。
class OrderedMap<TKey, TValue> {
private readonly Dictionary<TKey, TValue> _map = new Dictionary<TKey, TValue>();
private readonly List<TKey> _list = new List<TKey>();
public void Add(TKey key, TValue value) {
if (!_map.ContainsKey(key)) {
_list.Add(key);
}
_map[key] = value;
}
public void Add(TKey key, TValue value, int index) {
if (_map.ContainsKey(key)) {
_list.Remove(key);
}
_map[key] = value;
_list.Insert(index, key);
}
public TValue GetValue(TKey key) {
return _map[key];
}
public IEnumerabe<KeyValuePair<TKey, TValue>> GetItems() {
foreach (var key in _list) {
var value = _map[key];
yield return new KeyValuePair<TKey, TValue>(key, value);
}
}
}
请注意,与传统Dictionary<TKey, TValue>
相比,这确实带来了一些不平凡的性能差异。 例如,Add
和Remove
速度较慢。
Dictionary<TKey, TValue>
本质上是无序的(或者更确切地说,排序是不可预测的,不应该被依赖(。如果你想要某种排序,你需要使用不同的类型。如果不了解您的要求,就很难推荐任何特定类型。
无法订购Dictionary<TKey, TValue>
。
您可以改为尝试SortedDictionary<TKey, TValue>
,但该键按键排序,而不是按单独的索引排序。
Dictionary<TKey,TValue>
类不以有序的方式保存项目,因此没有"第一个"项目。
有一个SortedDictionary<Tkey,TValue>
(.NET 4.0+(,它按键排序,但同样,这是一个非常模糊的"第一"概念。
的解决方案,也许不是最好的解决方案,但它有效。 =(
public static ComboBox FillDropDownList(Dictionary<String, String> dictionary, ComboBox dropDown, String selecione)
{
var d = new SortedDictionary<String, String>();
d.Add("0", selecione);
foreach (KeyValuePair<string, string> pair in dictionary)
{
d.Add(pair.Key, pair.Value);
}
dropDown.DataSource = new BindingSource(d, null);
dropDown.DisplayMember = "Value";
dropDown.ValueMember = "Key";
dropDown.SelectedIndex = 0;
return dropDown;
}
Dictionary
是一个无序集合。你可以尝试OrderedDictionary
- http://msdn.microsoft.com/en-us/library/system.collections.specialized.ordereddictionary.aspx - 它有一个Insert()
的方法,这就是你所追求的。