Это невозможно с 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
медленнее.