【问题标题】:C# Iterate over Dictionary sorted by valueC#遍历按值排序的字典
【发布时间】:2012-02-10 05:02:48
【问题描述】:

有什么方法可以按排序顺序迭代字典,按 VALUE 而非键排序? 我确实读过“SortedDictionary”对象,但遗憾的是,它是按键排序的。 一种解决方案是让我用我的值翻转我的所有键,并将它们放入 SortedDictionary(因为它们都是整数)——但是,我也不完全确定如何使用那个。

【问题讨论】:

  • 您需要多久执行一次?它必须有多高效?你愿意用内存换取更快的速度吗?
  • 它只会对大约 500 个结果进行操作,而且只有一次。总是愿意用内存换取更快的速度:D

标签: c# dictionary loops sorted


【解决方案1】:

取出键/值对,对它们进行排序并迭代。使用 LINQ 非常容易:

foreach(var pair in dictionary.OrderBy(p => p.Value)) {
    // work with pair.Key and pair.Value
}

【讨论】:

  • 啊,谢谢! :) 这看起来完全符合我的需要。我经常听到这个 LINQ,它是什么?
  • @GeorgesOatesLarsen:不使用它是你错过的东西。您可能想阅读this 或谷歌它(现在肯定会有更好的介绍)。
【解决方案2】:

为了补全,上面建议的代码 (dictionary.OrderBy(p => p.Value)) “不会”用于自定义类型。

OrderBy 利用IComparable<T> 来比较两个对象。如果您的字典中的 Value 是自定义类型,那么它必须实现 IComparable<T> 才能以正确的方式对值进行排序。

继续阅读here

【讨论】:

  • “必须实现 IComparable”——不一定。 OrderBy() 有两个重载。其中一个的行为与您描述的一样,但第二个接受自定义 IComparable 对象,因此可以订购任何值类型。
  • @DXM,另一个重载接受IComparer,而不是IComparable,这没有多大意义。另外,我不认为这与值类型有任何关系,它对任何类型都一样。
  • @svick - 我的错字很糟糕,你是对的,它是 IComparer,但第二次重载正是 OP 所要求的。您可以编写自己的比较器对象来比较您想要的任何内容并将其提供给 OrderBy()。我所说的“价值”并不是指价值与参考。我的意思是价值与关键。我意识到比较器将与值类型以及引用类型一起使用。如果同意这个答案,即 OrderBy 只能由实现 IComparable 的类型使用,您能解释一下第二个重载的用途吗?
  • @DXM,我基本同意你的观点,第一个重载只能由实现IComparable 的类型使用。但第二个重载不仅仅适用于其他类型。这对于指定备用排序也很有用(例如,根据不同的文化对字符串进行排序)。
【解决方案3】:

// 按值排序字典

foreach (KeyValuePair<datatype, datatype> item in dictionary)
{
//do something by value....accessing item.value
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2015-08-07
    相关资源
    最近更新 更多