【问题标题】:How to sort the coordinates of a hash set in C#如何在C#中对哈希集的坐标进行排序
【发布时间】:2019-05-07 11:58:43
【问题描述】:

我在 HashSet 中保存坐标值。

而且我想按照上图中的顺序进行排序。

下面是一个典型的点结构,使用一个Hashset。

struct Point
{
    public int x, y;
    public Point(int x, int y)
    {
        this.x = x;
        this.y = y;
    }
}

private HashSet<Point> hashset = new HashSet<Point>();

我找到了一个只对一个值进行排序的来源。

但是,我还没有找到对两个或坐标值进行排序的来源。

举个例子说明如何对坐标进行排序。

【问题讨论】:

  • 您希望如何对给定象限内的点进行排序?
  • HashSet 没有顺序,这意味着使用 HashSet 或数组来存储值都没有关系。您想存储以特定排序顺序(在这种情况下您将不得不使用不同的容器)或以特定顺序读取它们的值吗?在这种情况下,您可以使用 LINQ 和任何允许使用 Comparer 参数进行排序的容器,并使用自定义比较器
  • 对于一个保持秩序的集合stackoverflow.com/questions/1552225/…
  • 实际上 HashSet 确实有一个顺序,因为您可以将它用作 IEnumerable 并且它在现实中确实保持顺序,但这不是一个可以依赖的行为,因为它不能保证,当然它不是一个好的无论如何都想这样做:)
  • @IlyaChernomordik 但不太可能是插入顺序,添加项目后可能会完全不同。

标签: c# sorting hashset


【解决方案1】:

您可以使用自定义比较器来实现您想要的,您可以在其中定义自己的规则:

var comparer = Comparer<Point>.Create((p1, p2) =>
{
    if (p1.y < p2.y)
    {
       return p1.x > p2.x ? 1 : -1;
    } 
    else
    {
       return p1.x < p2.x ? 1 : -1;
    }
});

hashset.OrderBy(p => p, comparer)

附:不是 100% 确定所有条件都是正确的,但你明白了我希望的想法,这样你就可以按照这个例子编写你想要的逻辑。

【讨论】:

    【解决方案2】:
    points.OrderBy(p => Math.Atan2(p.y, p.x))
    

    应该可以解决问题。

    它将按方向对点进行排序,从原点开始测量(即从“西”开始顺时针方向)

    如果您希望在基于集合的结构中保持该顺序,则需要重新考虑,因为HashSet&lt;T&gt; 没有隐式顺序。

    【讨论】:

      猜你喜欢
      • 2020-07-04
      • 2012-05-16
      • 2017-05-07
      • 1970-01-01
      • 1970-01-01
      • 2011-03-10
      • 2011-02-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多