0

C#でコアクラスの比較プログラムを作成する必要があります。私はを持っており、SortedSet<Vector2>それを繰り返すために、基本的な比較器が必要です。コレクション内の各要素に任意の順序でアクセスする必要があるため、特別なことは何も必要ありません。ただし、Vector2(Microsoft.Xna.Framework.Graphics)は、デフォルトの比較機能がないコンパイル済みdllです。

SortedSetにはプロパティComparerがありますが、ComparerにVector2比較器を割り当てる方法がわかりません。

4

3 に答える 3

4

IComparer<Vector2>を実装し、それを使用してコンストラクターを作成する独自のクラスを作成する必要がありますSortedSet

SortedSet<Vector2> sorted = new SortedSet<Vector2>(new MyCustomComparer());

比較者は、単一のメソッドを実装する必要がありますCompare

public class MyCustomComparer : IComparer<Vector2>
{
    public int Compare(Vector2 x, Vector2 y)
    {
        // Return appropriate value here, depending on the sort order you want
    }
}
于 2013-01-04T21:44:10.183 に答える
0

IComparer<T>まず、のインターフェイスを実装して、カスタム比較ツールを作成する必要がありますVector2

次に、カスタム比較子をインスタンス化して、SortedSetのコンストラクターに渡す必要があります。

SortedSet(T)コンストラクタ

于 2013-01-04T21:44:02.287 に答える
0

スキートは1つの良い解決策を与えました。.NETバージョン4.5を使用している場合は、次のようなラムダ式を使用することもできます。

new SortedSet<Vector2>(Comparer<Vector2>.Create(
    (v1, v2) => v1.X.CompareTo(v2.X)
    )

上記の例では、値を座標Vector2で単純に比較する必要があると想定しました(そして、同じベクトルは、比較対象者によって等しく「素晴らしい」と見なされます)。XX

長さで比較する別の例:

new SortedSet<Vector2>(Comparer<Vector2>.Create(
    (v1, v2) => (v1.X * v1.X + v1.Y * v1.Y).CompareTo(v2.X * v2.X + v2.Y * v2.Y)
    )

もちろん、論理が複雑であるv1か、等しいか、大きいかを判断する場合はv2、通常の方法を使用することをお勧めしますが、単純な場合は、新しいものなどを記述する必要がないため、ラムダが最適ですclass

于 2013-01-04T22:17:37.983 に答える