C#按任意顺序迭代字典

时间:2015-09-15 13:15:37

标签: c# sorting dictionary

我有Dictionary<string, List<Object>>。我遍历字典的键并显示按键分组的值。我知道SortedDictionary和OrderedDictionary,但是你如何按预定顺序对字典进行排序,而不仅仅是按字母顺序升序/降序?

假设我知道我的词典中的所有可能的键都存在于下面的列表中,并希望按以下顺序对字典进行排序:

  1. 快速
  2. 棕色
  3. 福克斯
  4. 我该怎么做?

4 个答案:

答案 0 :(得分:5)

您根本不对Dictionary<,>进行排序。但是,如果要按特定顺序迭代条目(或键),可以使用LINQ的OrderBy - 并按顺序迭代一组已知值,您可以在其他地方使用有序集。例如:

string[] orderedKeys = { "Quick", "Brown", "Fox", "Jumped", "Over" };
var orderedPairs = dictionary.OrderBy(pair => orderedKeys.IndexOf(pair.Key));
foreach (var pair in orderedPairs)
{
    // Use pair.Key and pair.Value here
}

答案 1 :(得分:1)

如果您希望始终按顺序访问键/值对,并从SortedDictionary中受益,则需要实现IComparer<string>并将其传递给您的字典构造函数。实现它的最简单方法是按照你想要的顺序拥有一个静态字符串数组,然后比较两个字符串的索引:

public class MyStringComparer : IComparer<string>
{

   static string[] StringsInOrder = new [] { "Quick", "Brown", "Fox", "Jumped", "Over" };
   public int Compare(string s1, string s2)
    {
        // find the indexes of the strings in the desired sort order
        int i1 = Array.IndexOf(StringsInOrder, s1);
        int i2 = Array.IndexOf(StringsInOrder, s2);

        if(i1 < 0)
            // put at the end in alpha order
            if(i2 < 0)
                return s1.CompareTo(s2);
            else  
                // send s1 to the end
                return 1;  
        else
           if(i2 < 0)
               // send s2 to the end
               return -1;
           else  
                // compare the indices in the array
                return i1.CompareTo(i2);
    }
}

用法:

var d = new SortedDictionary<string, string> (new MyStringComparer());

如果你想保留一个普通的字典用于其他目的(快速查找等),但只是偶尔对键进行排序然后使用Linq,Jon建议可能会更好。

答案 2 :(得分:0)

只是一个想法。你能为你的对象添加一个“SortKey”属性吗?使用LINQ获取排序列表?

答案 3 :(得分:0)

一种选择是迭代密钥列表并访问字典中的值。

string[] orderedKeys = { "Quick", "Brown", "Fox", "Jumped", "Over" };
foreach (var key in orderedKeys)
{
    List<object> values;
    if (dictionary.TryGetValue(key, out values))
    {
        // Here you have the key and the list of values
    }
    else
    {
        // The key was not in the dictionary.
    }
}

请注意,这不会在字典中为您提供列表中没有相应键的任何条目。如果列表有重复,它也可能会给你两次条目。