簡體   English   中英

在C#中為核心類編寫自定義比較器

[英]Writing a custom comparer for a core class in C#

我需要為C#中的核心類編寫比較器。 我有一個SortedSet<Vector2> ,為了迭代它,我需要一個基本的比較器。 不需要花哨的東西,因為我只需要以任何順序訪問集合中的每個元素。 但是Vector2( Microsoft.Xna.Framework.Graphics )是沒有默認比較器的已編譯dll。

我的SortedSet具有一個屬性Comparer但是我無法確定如何為Comparer分配一個Vector2比較器。

您需要創建自己的實現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
    }
}

首先,您需要通過實現Vector2IComparer<T>接口來創建自定義比較器。

然后,您必須實例化自定義比較器,並將其傳遞給SortedSet的構造函數:

SortedSet(T)構造函數

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的邏輯很復雜,則最好使用通常的方法,但是對於簡單的事情,lambda很棒,因為您無需編寫新class或任何東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM