基于两个值C#排序点类列表

时间:2012-09-13 05:15:04

标签: c# class

我想首先根据x然后在y上对C#中的类Point列表(见下文)进行排序。

public class Point
{
    public int x;
    public int y;
    public Point(int xp, int yp)
    {
        x = xp;
        y = yp;
    }
}

你是如何做到这一点的:我是C#的新手,并且与为类实现自定义比较器的Java比较方法有任何相似之处,而且我想将compare方法(int CompareTo)添加到类中在课堂上排序。

提前致谢。

4 个答案:

答案 0 :(得分:8)

是的,您正在寻找IComparable<T>IComparer<T> - 后者相当于Java中的Comparator<E>接口。

如果要向Point类本身添加比较,请Point实现IComparable<Point>(也可能是非通用的IComparable接口)。如果要在其他地方实现比较,请创建另一个类实现{.1}}。

对于 equality ,.NET也有IComparer<Point>IEquatable<T>。这些用于IEqualityComparer<T>中的关键比较。

作为旁注,我强烈建议您拥有公共字段 - 您可能希望制作变量Dictionary<,>。 (不可变类型通常更容易推理。)您可以决定readonly Point而不是struct

答案 1 :(得分:3)

var points = new List<Point>() { new Point(1,3), new Point(1,4), new Point(1,2) };
var sortedPoints = points.OrderBy(point => point.x).ThenBy(point => point.y);

答案 2 :(得分:1)

您可以实现IComparable接口并实现其

public int CompareTo( object obj )

在这个方法中,您可以编写比较两个对象的逻辑,例如:

if (objectA.x > objectB.x)
  return 1
else if (objectA.x < objectB.x)
  return -1
else // compare y in both objects

答案 3 :(得分:0)

您希望在C#中实现的接口是IComparable<T>,其行为类似于Java的Comparable。然后你的代码变成

public class Point : IComparable<Point>
{
    private int x;
    private int y;

    public int X
    {
        get { return x; }
    }

    public int Y
    {
        get { return y; }
    }

    public Point(int xp, int yp)
    {
        x = xp;
        y = yp;
    }

    public int CompareTo(Point other)
    {
        // Custom comparison here
    }
}

请注意,我将公共字段更改为私有字段,并将面向公众的界面更改为properties。这是更惯用的C# - 公共字段在Java和C#中都不受欢迎。