2011-01-26 6 views
0

ファイルからの入力に基づいて比較をセットアップしようとしています(つまり、2つの値が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

文字列よりも小文字を使用しようとすると混乱しますか?

文字列クラスに対して演算子が定義されていないため、プログラムがクラッシュするだけです。あなたはあなたのために比較を行うIComparerを受け入れることができ、その比較関数は、ある文字列が別の文字列の「より小さい」よりも小さいことを定義することができます。

関連する問題