0

IComparableタイプの2つの値を比較する関数を作成し、等しくない場合はスローします。基本的に、アサーションを作り直します。はい、私は車輪の再発明をしていることを知っています。

    public static void IsEqual<T>(T Value1, T Value2) where T : IComparable<T>
    {
        if (0 != Value1.CompareTo(Value2))
        {
            throw new ApplicationException("Fail");
        }
    }

文字列を除いて正常に動作します。大文字と小文字を区別しないオプションを期待していました。「AA」と「aa」

Tが文字列の場合は特にこのメソッドをオーバーライドしたいので、String.Compareを使用して大文字と小文字を区別しません。文字列を無視するかどうかをユーザーが指定できるように、別のパラメーターを用意するのもよいでしょう(ただし、これはintのような他のタイプには役に立たないので、紛らわしい/悪いデザインのようです。ここで提案を受け付けています)。

これを行う良い方法はありますか?また、IComparableとは異なるタイプに変更することもできます。当初は、これが仕事に最適なインターフェイスだと思っていましたが、今では間違っていた可能性があることに気づきました。

where T : IComparable<T>
4

2 に答える 2

2

特に文字列用に、別の関数を作成できます。

public static void IsEqual(string value1, string value2) 
{
  if (string.Compare(value1, value2, true) != 0)
    throw new ApplicationException("Fail for strings");
}

次にIsEqual(1, 1)、一般的なオーバーロードを呼び出すと呼び出されますがIsEqual("A", "a")、文字列オーバーロードを呼び出すと呼び出されます。次に、必要に応じて、文字列のオーバーロードに別のオプションのパラメーターを追加するだけです。

于 2012-05-22T19:25:01.247 に答える
1

あなたが試すことができます:

public static void IsEqual<T>(T Value1, T Value2) where T : IComparable<T>
    {
        if (typeof(T) == typeof(String))
        {
            if (String.Compare(Value1.ToString(), Value2.ToString(), true) != 0)
            {
                throw new ApplicationException("Fail");
            }
        }
        else if (0 != Value1.CompareTo(Value2))
        {
            throw new ApplicationException("Fail");
        }
    }
于 2012-05-22T19:26:59.823 に答える