我有一个像到位排序字典对于键
Dictionary<Person, int>
在C#中的字典,我想那种字典到位相对于键(在Person类的字段)。我该怎么做?互联网上的每一个可用的帮助都是列表,没有特定的词典排序示例。任何帮助将不胜感激!
我有一个像到位排序字典对于键
Dictionary<Person, int>
在C#中的字典,我想那种字典到位相对于键(在Person类的字段)。我该怎么做?互联网上的每一个可用的帮助都是列表,没有特定的词典排序示例。任何帮助将不胜感激!
您无法对Dictionary<TKey, TValue>
进行排序 - 它本质上是无序的。 (或者更确切地说,在条目被检索的顺序是实现特定的,你不应该依赖于它的工作版本之间的相同的方式,因为排序是不是它的设计功能的一部分。)
您可以使用SortedList<TKey, TValue>
或SortedDictionary<TKey, TValue>
,这两种方法都是通过键(按可配置的方式,如果将IEqualityComparer<T>
传递给构造函数)进行排序 - 可能对您有用吗?
在名称SortedList
中不太注意单词“list” - 它仍然是一个字典,它将键映射到值。它是实施内部有效地使用列表 - 所以,而不是查找哈希代码,它执行二进制搜索。 SortedDictionary
同样基于二进制搜索,但通过树而不是列表。
但要小心使用'SortedList
按设计,字典不可排序。如果您在字典中需要此功能,请改为查看SortedDictionary。
看看SortedDictionary
尝试,甚至有一个构造函数重载,所以你可以在自己的IComparable的通为比较。
正确答案已经说明了(只是使用SortedDictionary)。
然而,如果碰巧你有一些需要保留您的收藏如字典,可以访问词典按键有序的方式,通过,例如,在列表排序键,然后使用这个列表访问词典。一个例子...
Dictionary<string, int> dupcheck = new Dictionary<string, int>();
...一些代码,填写 “dupcheck”,然后...
if (dupcheck.Count > 0) {
Console.WriteLine("\ndupcheck (count: {0})\n----", dupcheck.Count);
var keys_sorted = dupcheck.Keys.ToList();
keys_sorted.Sort();
foreach (var k in keys_sorted) {
Console.WriteLine("{0} = {1}", k, dupcheck[k]);
}
}
不要忘记using System.Linq;
这一点。
虽然Dictionary是作为散列表实现的,但SortedDictionary是作为红黑树实现的。
如果您没有利用算法中的顺序,只需要在输出前对数据进行排序,则使用SortedDictionary的将对性能产生负面影响。
你可以在 “排序” 像这样的词典:
Dictionary<string, int> dictionary = new Dictionary<string, int>();
// algorithm
return new SortedDictionary<string, int>(dictionary);
由于这个答案较高的搜索配售我认为LINQ 排序依据解决方案是值得炫耀:
class Person
{
public Person(string firstname, string lastname)
{
FirstName = firstname;
LastName = lastname;
}
public string FirstName { get; set; }
public string LastName { get; set; }
}
static void Main(string[] args)
{
Dictionary<Person, int> People = new Dictionary<Person, int>();
People.Add(new Person("John", "Doe"), 1);
People.Add(new Person("Mary", "Poe"), 2);
People.Add(new Person("Richard", "Roe"), 3);
People.Add(new Person("Anne", "Roe"), 4);
People.Add(new Person("Mark", "Moe"), 5);
People.Add(new Person("Larry", "Loe"), 6);
People.Add(new Person("Jane", "Doe"), 7);
foreach (KeyValuePair<Person, int> person in People.OrderBy(i => i.Key.LastName))
{
Debug.WriteLine(person.Key.LastName + ", " + person.Key.FirstName + " - Id: " + person.Value.ToString());
}
}
输出:
Doe, John - Id: 1
Doe, Jane - Id: 7
Loe, Larry - Id: 6
Moe, Mark - Id: 5
Poe, Mary - Id: 2
Roe, Richard - Id: 3
Roe, Anne - Id: 4
在这个例子中,它会道理也使用ThenBy的名字:
foreach (KeyValuePair<Person, int> person in People.OrderBy(i => i.Key.LastName).ThenBy(i => i.Key.FirstName))
然后输出为:
Doe, Jane - Id: 7
Doe, John - Id: 1
Loe, Larry - Id: 6
Moe, Mark - Id: 5
Poe, Mary - Id: 2
Roe, Anne - Id: 4
Roe, Richard - Id: 3
LINQ也有OrderByDescending和ThenByDescending为那些需要它。
我不知道我理解你的问题,因为字典没有以任何顺序列举?您可以遍历键或值,您可以在运行时轻松进行排序... – 2010-04-24 18:22:41