c#按任意顺序遍历字典
本文关键字:遍历 字典 顺序 任意 | 更新日期: 2023-09-27 18:13:00
我有一个Dictionary<string, List<Object>>
。我循环遍历字典的键并显示按键分组的值。我知道SortedDictionary和OrderedDictionary,但如何按预定义的顺序排序字典,而不仅仅是按字母升序/降序排序?
假设我知道字典中所有可能的键都存在于下面的列表中,并希望字典按照以下顺序排序:
- 快速布朗福克斯
- 跳
- /
我该怎么做呢?
根本不排序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
}
如果您希望始终以该顺序访问键/值对并从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建议的可能更好。
只是一个想法。你能给你的对象添加一个SortKey属性吗?使用LINQ获得排序列表?
一种选择是迭代键列表并访问字典中的值。
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.
}
}
注意,这不会给你字典中任何在列表中没有对应键的条目。如果列表有重复项,它也可能给你两次条目。