簡體   English   中英

如何在C#中實現簡單的通用比較

[英]How to implement a simple generic comparison in C#

我剛剛開始探索使用泛型的基礎,並且我認為我可以實現這個簡單的模式來解決我日常使用中的典型問題。 我花了幾天時間尋找一個簡單的例子。 我可以找到尋找.Equals的例子,但過去並沒有多少。 我希望能夠實例化以下內容:

Spec<double> voltageSpec;
Spec<int> cyclesSpec;
Spec<myClass> fishInTheOceanSpec;

然后能夠:

bool isGood = voltageSpec.inSpec(5.0);
bool isGood cyclesSpec.inSpec(2);
bool isGood fishInTheOceanSpec.( new myClass(20));

我的嘗試如下所示。

/// <summary>
///  Generic object to hold a specification i.e min and max limits.
///  Implements a method to determin if a value is between limits.
/// </summary>
public class Spec<T> : IComparer<T> 
{
    public Spec()
    {
        Min = default(T);
        Max = default(T);
    }
    public T Min { get; set; }
    public T Max { get; set; }
    public bool inSpec(T Value) 
    {
        if ((Comparer<T>.Default.Compare(Value, this.Max) <= 0) &
            (Comparer<T>.Default.Compare(Value, this.Min) >= 0))
            return true;
        else 
            return false;
    }

    public int Compare(T x, T y)
    {
        if (x == y) return 0;
        if (x < y) return -1;
        if (x > y) return 1;
    }

    public Spec<T> Copy()
    {
        return (Spec<T>)this.MemberwiseClone();
    }
}

我將重構如下 - 讓T負責提供比較 - 這已經適用於原始類型,您的自定義類只需要實現IComparable<T>

public class Spec<T> where T : IComparable<T>
{
    public Spec()
    {
        Min = default(T);
        Max = default(T);
    }
    public T Min { get; set; }
    public T Max { get; set; }
    public bool inSpec(T Value)
    {
        if(Value.CompareTo(this.Max) <=0 &&
            Value.CompareTo(this.Min) >=0)
            return true;
        else
            return false;
    }

    public Spec<T> Copy()
    {
        return (Spec<T>)this.MemberwiseClone();
    }
}

像這樣宣布你的班級

public class Spec<T> : IComparer<T>
    where T : IComparable<T>
{
    .... 
}

然后你可以將CompareTo應用於T

public int Compare(T x, T y)
{
    return x.CompareTo(y);
}

intdoublestring這樣的基本類型實現了IComparable<T>

暫無
暫無

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

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