如何通过OrderedDictionary反向迭代

时间:2017-01-18 10:49:50

标签: c# linq ordereddictionary

如何反向迭代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];
}

6 个答案:

答案 0 :(得分: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())
{
}

此外,正如Ivan Stoev在评论中指出的那样,OrderedDictionary的退回项目根本没有订购,所以SortedDictionary就是你想要的。

答案 1 :(得分: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]];
    }
}

(当然还要添加你需要的其他方法。)

答案 2 :(得分:1)

你可以像这样获得Element At Index:

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

获取Key

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

答案 3 :(得分: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];
    }

答案 4 :(得分:1)

  

因为它不支持Linq扩展......

那是因为它是非通用Enumerable。您可以通过将其转换为正确的类型来使其成为通用的。

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

答案 5 :(得分: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);
            }