如何在C#中实现一个简单的通用比较#
问题描述:
我刚开始探索使用泛型的基本原理,并曾想过我可以实现这种简单模式来解决我日常使用中的典型问题。我花了几天时间寻找一个简单的例子。我可以找到寻找.Equals的例子,但没有太多过去。我希望能够用之类的实例:如何在C#中实现一个简单的通用比较#
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);
}
基本类型,如int
,double
或string
国家执行IComparable<T>
。
你可能彪&&在比较的一部分类。 – 2012-03-08 20:31:17
@EK,考虑使用完整的单词作为类名称,即名称范围类Range而不是Spec(这可能应该包括作为成员的特定属性的范围)。 – 2012-03-08 21:21:31