我有Dictionary<string, List<Object>>
。我遍历字典的键并显示按键分组的值。我知道SortedDictionary和OrderedDictionary,但是你如何按预定顺序对字典进行排序,而不仅仅是按字母顺序升序/降序?
假设我知道我的词典中的所有可能的键都存在于下面的列表中,并希望按以下顺序对字典进行排序:
我该怎么做?
答案 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.
}
}
请注意,这不会在字典中为您提供列表中没有相应键的任何条目。如果列表有重复,它也可能会给你两次条目。