Как реализовать простое общее сравнение в C # - PullRequest
1 голос
/ 09 марта 2012

Я только начинаю изучать основы использования дженериков и подумал бы, что смогу реализовать этот простой шаблон для решения типичной проблемы в повседневной работе. Я провел дни в поисках простого примера. Я могу найти примеры для поиска .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();
    }
}

Ответы [ 2 ]

2 голосов
/ 09 марта 2012

Я бы сделал рефакторинг следующим образом - сделайте 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();
    }
}
1 голос
/ 09 марта 2012

Объявите свой класс следующим образом

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

Затем вы можете применить CompareTo к T

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

Базовые типы, такие как int, double или string осуществить IComparable<T>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...