C# 如何在C中对哈希集的坐标进行排序#

C# 如何在C中对哈希集的坐标进行排序#,c#,sorting,hashset,C#,Sorting,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>(); 结构点 { 公共整数x,y

我正在哈希集中保存坐标值

我想按上图中的顺序对它进行排序

下面是一个典型的点结构,使用哈希集

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>();
结构点
{
公共整数x,y;
公共点(整数x,整数y)
{
这个.x=x;
这个。y=y;
}
}
私有HashSet HashSet=新HashSet();
我找到了一个只对一个值进行排序的源

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


给我一个如何对坐标进行排序的示例。

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

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)
var comparer=comparer.Create((p1,p2)=>
{
if(p1.yp2.x?1:-1;
} 
其他的
{
返回p1.xp,comparer)
另外,不是100%确定所有的条件都是正确的,但是你得到了我希望的想法,这样你就可以按照这个例子写出你想要的逻辑

points.OrderBy(p => Math.Atan2(p.y, p.x))
我们应该做到这一点

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


如果您希望在基于集合的结构中保持这种顺序,您需要重新考虑,因为
HashSet
没有隐式顺序。

您希望给定象限内的点如何排序?HashSet没有顺序,这意味着使用HashSet还是数组来存储值无关紧要。您想按特定的排序顺序存储值(在这种情况下,您必须使用不同的容器)还是按特定的顺序读取它们?在这种情况下,您可以使用LINQ和任何允许使用
Comparer
参数进行排序的容器,并使用自定义比较器和保存顺序的集合。实际上,HashSet确实有一个顺序,因为您可以将其用作IEnumerable,并且它实际上维护了顺序,但这不是一个可以依赖的行为,因为它不能保证,当然,这样做也不是一个好主意:)@IlyaChernomordik,但不太可能是插入顺序,并且在添加项目后可能会完全不同。