2017-05-17 2 views
2

2つのプリミティブ(数値!)タイプ(オブジェクトとしてボックス化されています)を比較して、より大きなものを見つける必要があります。 オブジェクトを取得するだけなのでジェネリックは使用できませんが、ボックス化されていない値はプリミティブな数値(int、short、long、floatなど)なので、IComparableにキャストできます。ボックス化されたプリミティブ値の動的比較

どのようにそれらを比べることができますか? CompareTo()は異なる型であるためにエラーをスローしますが、ChangeTypeはOverflowExceptionを引き起こします...?

 public static int Compare(object value1, object value2) 
    { 
     //e.g. value1 = (object)(int)1; value2 = (object)(float)2.0f 
     if (value1 is IComparable && value2 is IComparable) 
     { 
      return (value1 as IComparable).CompareTo(value2); 
      //throws exception bc value1.GetType() != value2.GetType() 
     } 
     throw new ArgumentException(); 
    } 
+0

「より大きい」とはどういう意味ですか?私はそれらがすべて数字であるという事実を与えられているということです私は数値比較の権利について話していると思いますか? – kuskmen

+0

明確にする必要がありますはい、正解:覚えてくれてありがとう、私は説明にこの情報を追加しました – Robin

答えて

1

そうかもしれない

public static int Compare(object value1, object value2) 
{ 
    if (value1 is double || value2 is double) 
    { 
     double d1 = Convert.ToDouble(value1); 
     double d2 = Convert.ToDouble(value2); 
     return d1.CompareTo(d2); 
    } 

    if (value1 is float || value2 is float) 
    { 
     float f1 = Convert.ToSingle(value1); 
     float f2 = Convert.ToSingle(value2); 
     return f1.CompareTo(f2); 
    } 

    long x1 = Convert.ToInt64(value1); 
    long x2 = Convert.ToInt64(value2); 
    return x1.CompareTo(x2); 
} 

バイト、ショート、タイプは精度を失うことなくlongに変換することができますint型。

+0

はい、これは解決策かもしれません...しかし、これらのタイプは異なる可能性があります。手動チェックの多くが必要です.. - ダブルまたは浮動小数点数 - > doubleに変換 - int、short、byte、sbyte、uint、ushort、lung - > longに変換 - 1つはulongですか? - > ulong? - 小数点第1位ですか? - >? ...すべての可能性を組み合わせるよりも...(場合によっては "<"比較が許可されない)... それは私がより一般的なアプローチを探していた理由です... – Robin

+0

大丈夫、私はあなたの解決策があると思います依然として最高です。https://msdn.microsoft.com/de-de/library/system.valuetype(v=vs.110).aspxタンクしてください! – Robin

関連する問題