2017-01-18 7 views
0

Как я могу перебирать через OrderedDictionary в обратном направлении и получать доступ к его ключам? Так как он не имеет поддержки расширений Linq Я попытался следующие:Как проиграть в обратном направлении через упорядоченный документ

var orderedDictionary= new OrderedDictionary(); 
orderedDictionary.Add("something", someObject); 
orderedDictionary.Add("another", anotherObject); 

for (var dictIndex = orderedDictionary.Count - 1; dictIndex != 0; dictIndex--) 
{ 
    // gives me the value, how to get the key ? e.g. "something" and "another" 
    var key = orderedDictionary[dictIndex]; 
} 
+2

Это не имеет значения, если вы итерация его в обратном или обычном порядке, потому что, как говорится, Документация, * Элементы в OrderedDictionary не отсортированы по ключу, в отличии от элементов SortedDictionary класс . * –

+0

Порядок вставки - причина, по которой я использую OrderDictionary, мне нужно итератировать его соответствующим образом (в обратном порядке). –

+0

Вы всегда можете перебирать свойства ключей словаря. – jdweng

ответ

2

Вы можете уменьшить сложность этой проблемы значительно используя обычный Dictionary (или SortedDictionary, в зависимости от ваших требований) и держать вторичную List следить за ключами вставка заказ. Вы даже можете использовать класс для облегчения этой организации:

public class DictionaryList<TKey, TValue> 
{ 
    private Dictionary<TKey, TValue> _dict; 
    private List<TKey> _list; 

    public TValue this[TKey key] 
    { 
     get { return _dict[key]; } 
     set { _dict[key] = value; } 
    } 

    public DictionaryList() 
    { 
     _dict = new Dictionary<TKey, TValue>(); 
     _list = new List<TKey>(); 
    } 

    public void Add(TKey key, TValue value) 
    { 
     _dict.Add(key, value); 
     _list.Add(key); 
    } 

    public IEnumerable<TValue> GetValuesReverse() 
    { 
     for (int i = _list.Count - 1; i >= 0; i--) 
      yield return _dict[_list[i]]; 
    } 
} 

(И, конечно, добавить любые другие методы вам нужно, а также.)

+0

это достигает того, к чему я стремлюсь, и у вас будет меньше ограничений для дальнейших настроек. –

1

Вы можете получить элемент по индексу, как это:

orderedDictionary.Cast<DictionaryEntry>().ElementAt(dictIndex); 

И для получения Key

orderedDictionary.Cast<DictionaryEntry>().ElementAt(dictIndex).K‌​ey.ToString(); 
+0

Я собираюсь попробовать, кажется разумным для меня. –

+2

Остерегайтесь сложности O (n) 'ElementAt'. Таким образом, применение этого к каждому элементу коллекции приведет к сложности o (n2) (что, вероятно, будет довольно неприятным, если оно используется не в том месте) – spender

+0

@spender не знал об этом факте. спасибо, что вызвали его. –

2

мая Я предлагаю использовать SortedDictionary<K, V>? Он поддерживает LINQ и типобезопасно:

var orderedDictionary = new SortedDictionary<string, string>(); 
orderedDictionary.Add("something", "a"); 
orderedDictionary.Add("another", "b"); 

foreach (KeyValuePair<string, string> kvp in orderedDictionary.Reverse()) 
{ 
} 

Кроме того, как Иван Stoev отметил в комментариях, возвращаемый товар OrderedDictionary не упорядочены вообще, так SortedDictionary является то, что вы хотите.

+0

Мне нужно сохранить порядок вставки без изменений, если я не ошибаюсь, SortedDictionary не сохранит порядок вставки. –

+0

Затем используйте «Словарь » –

+0

Я не верю, что Словарь сохраняет порядок вставки, как описано здесь: http://stackoverflow.com/questions/16694182/ordereddictionary-and-dictionary –

0

Вам нужно использовать OrderdDictionary. Вы всегда можете использовать SortedDictionary, как показано ниже.

var orderedDictionary = new SortedDictionary<int, string>(); 
      orderedDictionary.Add(1, "Abacas"); 
      orderedDictionary.Add(2, "Lion"); 
      orderedDictionary.Add(3, "Zebera"); 

      var reverseList = orderedDictionary.ToList().OrderByDescending(pair => pair.Value); 

      foreach (var item in reverseList) 
      { 
       Debug.Print(item.Value); 
      } 
1

Меня не волнует факт факта. Вы можете получить ключ, скопировав ключи в индексируемую коллекцию. Также необходимо изменить состояние петли на dictIndex > -1;.

Пожалуйста, попробуйте следующее:

var orderedDictionary = new OrderedDictionary(); 
    orderedDictionary.Add("something", someObject); 
    orderedDictionary.Add("another", anotherObject); 

    object[] keys = new object[orderedDictionary.Keys.Count]; 
    orderedDictionary.Keys.CopyTo(keys, 0);  

    for (var dictIndex = orderedDictionary.Count-1; dictIndex > -1; dictIndex--) 
    { 
     // gives me the value, how to get the key ? e.g. "something" and "another" 
     var value = orderedDictionary[dictIndex]; 
     //get your key e.g. "something" and "another" 
     var key = keys[dictIndex]; 
    } 
0

Поскольку он не имеет поддержки расширений Linq .. .

Это потому, что это не общий Enumerable. Вы можете сделать его общим, переведя его в нужный тип.

foreach (var entry in orderedDictionary.Cast<DictionaryEntry>().Reverse()) { 
    var key = entry.Key; 
    var value = entry.Value; 
}