Короткий ответ: пути не должно быть, так как словарь «Представляет коллекцию ключей и значений». что не подразумевает какого-либо порядка. Любой взлом, который вы можете найти, находится за пределами определения класса и может измениться.
Вероятно, вам следует сначала спросить себя, действительно ли в этой ситуации требуется Словарь, или можете ли вы избежать использования списка KeyValuePairs.
В противном случае что-то подобное может быть полезно:
public class IndexableDictionary<T1, T2> : Dictionary<T1, T2>
{
private SortedDictionary<int, T1> _sortedKeys;
public IndexableDictionary()
{
_sortedKeys = new SortedDictionary<int, T1>();
}
public new void Add(T1 key, T2 value)
{
_sortedKeys.Add(_sortedKeys.Count + 1, key);
base.Add(key, value);
}
private IEnumerable<KeyValuePair<T1, T2>> Enumerable()
{
foreach (T1 key in _sortedKeys.Values)
{
yield return new KeyValuePair<T1, T2>(key, this[key]);
}
}
public new IEnumerator<KeyValuePair<T1, T2>> GetEnumerator()
{
return Enumerable().GetEnumerator();
}
public KeyValuePair<T1, T2> this[int index]
{
get
{
return new KeyValuePair<T1, T2> (_sortedKeys[index], base[_sortedKeys[index]]);
}
set
{
_sortedKeys[index] = value.Key;
base[value.Key] = value.Value;
}
}
}
Код клиента выглядит примерно так:
static void Main(string[] args)
{
IndexableDictionary<string, string> fooDict = new IndexableDictionary<string, string>();
fooDict.Add("One", "One");
fooDict.Add("Two", "Two");
fooDict.Add("Three", "Three");
// Print One, Two, Three
foreach (KeyValuePair<string, string> kvp in fooDict)
Console.WriteLine(kvp.Value);
KeyValuePair<string, string> temp = fooDict[1];
fooDict[1] = fooDict[2];
fooDict[2] = temp;
// Print Two, One, Three
foreach (KeyValuePair<string, string> kvp in fooDict)
Console.WriteLine(kvp.Value);
Console.ReadLine();
}
ОБНОВЛЕНИЕ: По какой-то причине он не позволяет мне комментировать свой собственный ответ.
В любом случае IndexableDictionary отличается от OrderedDictionary тем, что
- "Элементы OrderedDictionary никак не отсортированы." Так что foreach's не обратил бы внимания на числовые показатели
- Он строго типизирован, поэтому вам не нужно возиться с приведением вещей из структур DictionaryEntry