如何在字典的第一个索引中插入元素

本文关键字:索引 插入 元素 第一个 字典 | 更新日期: 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>相比,这确实带来了一些不平凡的性能差异。 例如,AddRemove速度较慢。

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()的方法,这就是你所追求的。