4

最初に x に基づいて、次に y に基づいて、C# のクラス Points のリスト (以下を参照) を並べ替えたいと思います。

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

どのようにこれを行いますか: 私は C# が初めてで、クラスのカスタム コンパレータを実装する Java 比較メソッドとの類似点はありますか?また、比較メソッド (int CompareTo) をクラスに追加して、クラス。

前もって感謝します。

4

4 に答える 4

8

はい、あなたが探しているのはIComparable<T>and - 後者はJava のインターフェースにIComparer<T>相当します。Comparator<E>

Pointクラス自体に比較を追加したい場合は、 Pointimplementを作成しますIComparable<Point>(おそらく非ジェネリックIComparableインターフェイスも)。他の場所で比較を実装したい場合は、別のクラスに実装させIComparer<Point>ます。

同等性のために、.NET にも と がIEquatable<T>ありIEqualityComparer<T>ます。これらは、 のキー比較などに使用されDictionary<,>ます。

余談ですが、パブリック フィールドを持たないことを強くお勧めします。また、変数を作成することもできますreadonly。(一般に、不変型のほうが簡単に推論できます。) .Pointよりstructclass.

于 2012-09-13T05:17:00.647 に答える
4
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);
于 2012-09-13T05:17:04.467 に答える
1

IComparableインターフェイスを実装し、その実装することができます

public int CompareTo( object obj )

このメソッドでは、たとえば次のように 2 つのオブジェクトを比較するロジックを記述できます。

if (objectA.x > objectB.x)
  return 1
else if (objectA.x < objectB.x)
  return -1
else // compare y in both objects
于 2012-09-13T05:18:42.260 に答える
0

C# で実装するインターフェイスは、Java の Comparable のように機能するIComparable<T>です。コードは次のようになります

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# の両方で嫌われています。

于 2012-09-13T05:17:59.613 に答える