2011-01-26 29 views
0

我想设置一个基于文件输入的比较(即两个值在XML选项文件中,并阅读,我想比较它们)。泛型可以用于结合这些方法吗?

我可以做到这一点,但它看起来有点冗长。我想我会在这里发布它,看看是否有一种方法可以通过泛型来完成我的比较。

这里是我的方法:

// Only equal is supported for strings. 
public static bool CompareString(this ComparisionOperator oper, string leftSide, string rightSide) 
{ 
    return leftSide == rightSide; 
} 


public static bool CompareDouble(this ComparisionOperator oper, double leftSide, double rightSide) 
{ 
    switch (oper) 
    { 
     case ComparisionOperator.LessThan: 
      return leftSide < rightSide; 
     case ComparisionOperator.GreaterThan: 
      return leftSide > rightSide; 
     case ComparisionOperator.LessThanOrEqualTo: 
      return leftSide <= rightSide; 
     case ComparisionOperator.GreaterThanOrEqualTo: 
      return leftSide >= rightSide; 
     case ComparisionOperator.EqualTo: 
      return leftSide == rightSide; 
     default: 
      throw new ArgumentOutOfRangeException("oper"); 
    } 
} 


public static bool CompareDateTime(this ComparisionOperator oper, DateTime leftSide, DateTime rightSide) 
{ 
    switch (oper) 
    { 
     case ComparisionOperator.LessThan: 
      return leftSide < rightSide; 
     case ComparisionOperator.GreaterThan: 
      return leftSide > rightSide; 
     case ComparisionOperator.LessThanOrEqualTo: 
      return leftSide <= rightSide; 
     case ComparisionOperator.GreaterThanOrEqualTo: 
      return leftSide >= rightSide; 
     case ComparisionOperator.EqualTo: 
      return leftSide == rightSide; 
     default: 
      throw new ArgumentOutOfRangeException("oper"); 
    } 
} 

// Repeated for Int (and maybe GUID) 

我是最好只重复这些?

我遇到的问题是比较字符串与比较数字或日期时间不一样。如果我只是创建一个泛型方法并传入一个字符串,当它尝试对一个字符串做一个小于一个字符串时会感到困惑吗?

+4

环顾Comparer .Default(http://msdn.microsoft.com/en-us/library/cfttsh47.aspx) –

回答

3

您可以通过限制实现IComparable<T>的类型来对某些类型的泛型进行重构。

public static bool Compare<T>(this ComparisionOperator oper, T leftSide, T rightSide) 
    where T : IComparable<T> 
{ 
    switch (oper) 
    { 
     case ComparisionOperator.LessThan: 
      return leftSide.CompareTo(rightSide) < 0; 
     case ComparisionOperator.GreaterThan: 
      return leftSide.CompareTo(rightSide) > 0; 
     case ComparisionOperator.LessThanOrEqualTo: 
      return leftSide.CompareTo(rightSide) <= 0; 
     case ComparisionOperator.GreaterThanOrEqualTo: 
      return leftSide.CompareTo(rightSide) >= 0; 
     case ComparisionOperator.EqualTo: 
      return leftSide.CompareTo(rightSide) == 0; 
     default: 
      throw new ArgumentOutOfRangeException("oper"); 
    } 
} 

这将为相当多的工作类型,为Int32DoubleSingle,等一切落实IComparable<T>

0

当它试图对一个字符串做一个小于一个字符串时它会感到困惑吗?

你的程序只会崩溃,因为这些运算符没有为String类定义。你可以接受一个I​​Comparer来为你做比较,那个比较器可以定义一个字符串“小于”“大于”另一个字符串的含义。

相关问题