【问题标题】:Sort a Dictionary<Point, int> based on its key根据其键对 Dictionary<Point, int> 进行排序
【发布时间】:2014-05-31 22:30:34
【问题描述】:

我有一个Dictionary&lt;Point, int&gt; MyDicPoint 类定义如下:

public class Point
{
    public double X { get; set; }
    public double Y { get; set; }
}

如何使用LINQ 根据KeyMyDic 进行排序?我想通过X 订购,然后通过Y 订购。

例如,如果我的字典如下所示:

Key (Point (X,Y))          Value (int)
--------------------------------------
(8,9)                      6
(5,4)                      3
(1,4)                      2
(11,14)                    1

排序后是这样的:

Key (Point (X,Y))          Value (int)
--------------------------------------
(1,4)                      2
(5,4)                      3
(8,9)                      6
(11,14)                    1

【问题讨论】:

  • 如果您要将自定义类存储在字典中,您确实应该覆盖 GetHashCodeEquals
  • @ScottChamberlain 这适用于我在字典中使用的所有自定义类,还是仅适用于我要排序的字典?
  • 如果您创建了一个没有自定义比较器的字典,它将使用Comparer&lt;T&gt;.Default,而后者又在类上使用GetHashCode()Equals(object)。因此,对于您使用的每个字典,您的选择是要么拥有一个实现 Equals(GetHashCode() 的类,要么使用一个使用不依赖于 Equals()GetHashCode() 内置类型的自定义比较器的字典(因为它提供了它自己的这两个实现)。
  • 就我不排序字典而言,我可以在字典中使用自定义类对吗?
  • 只要您正在创建将IComparer&lt;TKey&gt; 传递给构造函数的字典,或者自定义类覆盖GetHashCode()Equals(object),就可以。但是还有其他问题,例如键 must be immutable 被用作字典的键。

标签: c# linq sorting dictionary


【解决方案1】:

OrderByThenBy 应该可以为您解决问题:

MyDic.OrderBy(x => x.Key.X)
    .ThenBy(x => x.Key.Y)
    .ToDictionary(x => x.Key, x => x.Value)

【讨论】:

  • 嗯,为什么最后是 .ToDictonary?字典不会保留任何类型的排序,你能做的最好的就是SortedList&lt;Point,int&gt; 或类似的。
  • @ScottChamberlain 是的,但这并不意味着您不能对字典进行排序。 dotnetfiddle.net/QajyMh
  • @ScottChamberlain Selman 根据我使用字典的问题回答,Sortedlist 似乎是个好主意,我会试试。谢谢。字典在起作用。
  • @ScottChamberlain 对了,既然没有 ToSortedList() 那样的东西,我们怎么能使用 SortedList,你的意思是我原来的集合应该是一个 SortedList?
  • @Vahid 创建一个“扩展方法”,基本上是public static SortedList&lt;T,V&gt; ToSortedList(this IDictionary&lt;T,V&gt; dict) { return new SortedList&lt;T,V&gt;(dict); } 你可以把上面的代码改成MyDict.ToSortedList()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-27
  • 2011-04-05
  • 2011-12-11
  • 1970-01-01
  • 2014-04-27
  • 1970-01-01
相关资源
最近更新 更多