【问题标题】:Writing a custom comparer for a core class in C#在 C# 中为核心类编写自定义比较器
【发布时间】:2013-01-04 21:42:34
【问题描述】:

我需要为 C# 中的核心类编写一个比较器。我有一个SortedSet<Vector2>,为了遍历它,我需要一个基本的比较器。不需要任何花哨的东西,因为我只需要以任何顺序访问集合中的每个元素。但是 Vector2 (Microsoft.Xna.Framework.Graphics) 是一个没有默认比较器的编译 dll。

我的SortedSet 有一个属性Comparer,但我不知道如何为 Comparer 分配一个 Vector2 比较器。

【问题讨论】:

  • 将其传递给构造函数。

标签: c# graphics xna comparator sortedset


【解决方案1】:

您需要创建自己的实现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
    }
}

【讨论】:

  • 也可以直接从Comparer&lt;T&gt; 派生而不是IComparer&lt;T&gt;。我更喜欢Comparer&lt;T&gt;,因为您还可以免费获得IComparer,但实际上并不重要。
  • @CodesInChaos 我刚刚删除了一条几乎相同的评论(你是第一个)。
【解决方案2】:

首先,您需要通过为Vector2 实现IComparer&lt;T&gt; 接口来创建自定义比较器。

然后您必须实例化您的自定义比较器并将其传递给 SortedSet 的构造函数:

SortedSet(T) Constructor

【讨论】:

    【解决方案3】:

    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 或任何东西。

    【讨论】:

    • 如果你把比较器写成一个单独的对象,然后只在 SortedSet 构造函数中作为参数使用,那就更好了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    • 2021-01-16
    • 1970-01-01
    • 2020-11-27
    • 2020-03-08
    • 2019-05-23
    • 1970-01-01
    相关资源
    最近更新 更多