関数を100回オーバーロードするか、異なるタイプのCompareerを100個作成するのではなく、1つの関数内で型をチェックすることにしました。タイプをチェックする最も速い方法は何ですか?
たとえば、2つのオブジェクト内の型セット(プリミティブと文字列)の値を比較するために、デフォルトの比較演算子を使用しています。これは、次のコードが含まれています
public class DefComparer : IComparer<object> {
public int Compare(object a, object b) {
.... // a = a.GetType().GetField(field).GetValue(a); - not important for the question but I'm just showing that a&b below are different references
switch (a.GetType().Name) {
case "Byte":
if ((byte)a == (byte)b) return 0;
else if ((byte)a > (byte)b) return 1;
else return -1;
case "UInt16":
if ((ushort)a == (ushort)b) return 0;
else if ((ushort)a > (ushort)b) return 1;
else return -1;
case "SByte":
if ((sbyte)a == (sbyte)b) return 0;
else if ((sbyte)a > (sbyte)b) return 1;
else return -1;
case "Int16":
...
ここで私はif
/else
文のチェーンよりも高速であると言われてswitch
文を使用しています。しかし、a.GetType().Name
は動的に取得される文字列を返し、このメソッドは文字列の比較を含みます。それは私にとって特に速くは聞こえません。私はComparerが技術的に可能な限り高速であることが必要です。なぜなら、それは大量のデータのコレクションで使用されるからです。
Q:文字列比較を含まないオブジェクトの種類を確認する方法はありますか?最速の方法は何ですか?
あなたは 'Comparer.Default'を探しています。 – SLaks
または((IComparable)a).CompareTo(b) – usr
いいえ私は 'Comparer.Default'を探していません。私はより明確にするために投稿を編集しました。私の質問は、タイプをチェックする簡単な方法です。 – brandon