.NET:如何对通用字典进行排序?

Bob*_*Bob 3 .net c#

我有一个词典: Dictionary<string, CustomClass> _details = new Dictionary<string, CustomClass>()

CustomClass实现,IComparable因为方法中有自定义排序逻辑CompareTo().

我想CustomClass按排序顺序遍历_details中的所有内容.

所以我想做这样的事情:

foreach (string value in _details.Values.Sort())
{

}
Run Code Online (Sandbox Code Playgroud)

但这Sort()不是一种方法

我有什么选择?

Jon*_*eet 9

你的问题有些不清楚,但重新阅读时,你似乎想要按价值而不是按键排序.在这种情况下,LINQ是使用该OrderBy方法的最佳方法:

foreach (var pair in _details.OrderBy(p => p.Value))
{
    // Use pair.Key and pair.Value here
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您只想要第一个值:

foreach (var value in _details.Values.OrderBy(p => p))
{
    // Use value in here
}
Run Code Online (Sandbox Code Playgroud)

请注意,您无法就地排序字典 - Dictionary<,>基本上是无序的(或者更确切地说,顺序是实现细节,并且不能以可靠的方式更改).

如果你想按键排序,那么使用SortedList<,>SortedDictionary<,>开始使用可能会更好.这两个都将保持集合永久按键排序.


Cod*_*aos 8

Linq为OrderBy所有可用的enumerables 提供了一种方法.它会在每次调用时创建一个副本,而不会修改原始集合.

你的代码片段:string key in _details.Values没有任何意义.Values包含值而不是键.我假设您想迭代键值对,即foreach(_details.OrderBy中的var对(pair => pair.Value))

如果要在使用它进行排序后丢弃该值,可以添加一个.Select(pair=>pair.Key).如果您只对价值感兴趣,那就更简单了:

foreach(var value in _details.OrderBy(v=>v))
Run Code Online (Sandbox Code Playgroud)