.NET:如何对泛型字典进行排序?

3

我有一个字典:

Dictionary<string, CustomClass> _details = new Dictionary<string, CustomClass>()

CustomClass 实现了 IComparable 接口,因为在 CompareTo() 方法中有自定义的排序逻辑。

我想按照排序顺序循环遍历所有在 _details 中的 CustomClass

所以我希望做类似这样的事情:

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

}

但是 Sort() 不是该类型的一个方法

那么我的选择是什么?


2
你的问题标题中是否意思是“非泛型”? - stakx - no longer contributing
你想按键还是值排序? - Christian.K
2个回答

9

你的问题有点不清楚,但是在重新阅读后,似乎你想按值而不是键排序。在这种情况下,使用 LINQ 是最好的方法,其中包括 OrderBy 方法:

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

如果你只想得到第一个位置的值:

foreach (var value in _details.Values.OrderBy(p => p))
{
    // Use value in here
}

请注意,无法原地对字典进行排序 - Dictionary<,>基本上是无序的(或者说,顺序是一种实现细节,不能以可靠方式更改)。
如果您想按键排序,则最好使用SortedList<,>SortedDictionary<,>。这两个集合都将保持按键永久排序。

他似乎想按值而不是按键排序。但可能他把键和值搞混了,真正想要的是 CustomClass 作为键。 - CodesInChaos
1
@CodeInChaos:不清楚他是想按值排序,还是想要,但按键排序。编辑:糟糕,刚看到CustomClass实现了IComparable,所以很可能是按值排序。正在编辑... - Jon Skeet
是的,我想按值而不是键排序。我想以排序顺序循环遍历值,并且我希望使用CustomClass中的IComparable.CompareTo()方法进行排序,因为有很多排序逻辑,即OrderBy将不足以满足要求。 - Bob
1
@Bob:OrderBy 有什么不够的呢?它会自动使用你的自定义比较器 - 我们是按 CustomClass 进行排序,也就是将 CustomClass 的值相互进行比较。 - Jon Skeet
哦,我没想到OrderBy能解决问题...我会试一下的,谢谢。 - Bob

8
Linq提供了一个适用于所有可枚举对象的OrderBy方法。每次调用都会创建一个副本,不会修改原始集合。
您的代码片段:string key in _details.Values 没有任何意义。Values包含值而不是键。我假设你想遍历键值对,即 foreach(var pair in _details.OrderBy(pair=>pair.Value))
如果您想在使用排序后丢弃值,可以添加.Select(pair=>pair.Key)。如果您只对值感兴趣,那么更简单:
foreach(var value in _details.OrderBy(v=>v))

嗨。抱歉让你感到困惑,我想按照值而不是键进行排序,我已经更正了问题描述。 - Bob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接