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

Skeet 给出了一个很好的解决方案。如果您使用 .NET 4.5 版,您还可以使用 lambda 表达式,如下所示:

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

在上面的示例中,我只是假设Vector2值应该简单地通过X坐标进行比较(并且具有相同的向量X将被我的比较器视为同样“伟大”)。

另一个按长度比较的例子:

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很复杂,最好有一个常用的方法,但对于简单的事情,lambdas 很棒,因为你不需要编写新的class或任何东西。

于 2013-01-04T22:17:37.983 回答