Вместо того, чтобы перегружать функцию 100 раз или создавать 100 разных Comparers для разных типов, я решил проверить тип внутри одной функции.Что является самым быстрым способом проверки типа?
Например, я использую сопоставление по умолчанию для сравнения значений набора типов (примитивов и строк) в пределах 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":
...
Здесь я использую switch
о том, что, как говорят, быстрее, чем цепь if
/else
заявления. Но a.GetType().Name
возвращает динамически полученную строку, и этот метод включает в себя сравнение строк. Это звучит не очень быстро. Мне нужен Comparer так же быстро, как это технически возможно, потому что он будет использоваться для больших коллекций данных.
Вопрос: Есть ли более быстрый способ проверить тип объекта (который не включает сравнение строк)? Каков самый быстрый способ?
Вы ищете 'Comparer.Default'. – SLaks
Или вызов ((IComparable) a) .CompareTo (b) – usr
Нет. Я не ищу 'Comparer.Default'. Я редактировал свой пост, чтобы сделать его более понятным. Мой вопрос - это быстрый способ проверить тип. – brandon