2015-09-15 112 views
0

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

假设我知道在我的字典中的所有可能的密钥将在下面的列表中存在,并希望词典以下顺序进行排序:

  1. 快速
  2. 布朗
  3. 福克斯
  4. 跳跃
  5. 超过

我该如何克服o关于这样做?

+1

您可以使用'SortedDictionary <字符串,列表>'并在创建字典的实例 –

+0

时提供'IComparer '没有任何逻辑可以为您提供该顺序。无论你如何实施它,你都必须自己挑选订单。 – Jonesopolis

+1

排序和任意顺序是互斥的。 “排序”意味着满足对象之间的某些关系。排序是重新排序容器中的对象以符合这些条件。 – luk32

回答

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 
} 
+2

为什么不直接遍历'orderedKeys'并直接访问字典值呢? – juharr

+1

@juharr:这是另一种选择,是的 - 你需要小心不要访问一个虽然不存在的密钥,并且你不会提取任何你事先不知道的密钥。 –

+0

当然,您的订购会在开始时放置任何未知的键,因为IndexOf会返回-1。 – juharr

0

只是一个想法。你可以添加一个“SortKey”属性到你的对象&使用LINQ来获得一个排序列表?

1

如果你想总是访问从你需要实现IComparer<string>并传递给你的字典构造一个SortedDictionary的顺序和收益的键/值对。实现它的最简单的方法是在你想要的顺序串的静态数组,然后比较两个字符串的指标:

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建议可能会更好整体。

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. 
    } 
} 

请注意,这不会给你任何词典中没有列表中相应键的条目。如果列表有重复,它也可能会给你两次输入。