Оптимизированный C # эквивалент tsql "в (значение1, значение2)"? - PullRequest
0 голосов
/ 23 сентября 2011

В SQL вы можете написать что-то вроде if value в (value1, value2) then ... else ...

В C # было бы неплохо написать

 A) if( value == (value1 or value2) ) { ... }

Или

 B) if( value in (value1, value2) ) { ... }

Конечно, вы уже можете написать:

 C) if( new[]{value1, value2}.Contains(value) )

Но этот код работает медленно, поскольку он создает новый массив.

Какой из них вам больше нравится?

Ответы [ 4 ]

2 голосов
/ 23 сентября 2011

Если value1 и value2 всегда одинаковы, я бы собрал коллекцию (набор, массив, список или что-то еще) один раз и сохранил бы их в статической переменной.

В противном случае, я бы, наверное, написал:

if (value == value1 || value == value2)

Если бы у меня было несколько значений, то для читабельности я бы создал бы коллекцию - но только с двумя значениями я бы не стал беспокоиться - вышеприведенное более читаемо, чем форма для создания массива, IMO.

Если бы я бы выбрал форму для создания коллекции, я бы тогда рассмотрел вопрос об оптимизации , возвращаясь к форме, не создающей коллекцию, только когда я обнаружил, что приложение был слишком медленным и доказал, что это было связано с созданием коллекции.

Другими словами:

  • Сначала простота (сравнение двух значений с == и || в порядке)
  • Снова простота (создайте коллекцию, когда она действительно улучшает простоту)
  • Производительность только тогда, когда она была протестирована и признана важной в этом фрагменте кода
  • Простота и производительность вместе, где это возможно (с использованием одной "постоянной" коллекции, где это имеет смысл)
1 голос
/ 23 сентября 2011

Зависит от баланса производительности, которого вы хотите достичь, и размера вашего набора данных.

Если вы можете позволить себе относительно дорогую конструкцию и , то поиск абсолютно критичен с точки зрения производительности и , поиск часто происходит по сравнению со строительством и количество элементов достаточно велико, чтобы оправдать все это, создайте новый HashSet, затем используйте HashSet.Contains.

Если, с другой стороны, у вас есть только несколько предметов, возможно, достаточно иметь if (value == value1 || value == value2 /* Etc.. */). Просто будьте осторожны, чтобы «отсортировать» ваши значения от наиболее вероятных к минимальным. Например, если value2 имеет тенденцию совпадать чаще, чем value1, перепишите вышеприведенное «если» как: if (value == value2 || value == value1), чтобы оператор || мог выполнить свое короткое замыкание.

1 голос
/ 23 сентября 2011

Если бы это было только два или три значения, я бы использовал if (value == value1 || value == value2), иначе вы могли бы использовать свой третий способ, но сделать массив статическим, если он не изменяется.

0 голосов
/ 03 октября 2011

Идея в том, чтобы иметь конструкцию, более легкую для чтения, чем серия IF, если у вас мало непостоянных элементов.Я предложу команде C # добавить следующую конструкцию в C # следующим образом:

if (значение в (value1, value2)) {...}

, которое должно быть расширено до временной коллекциии используйте Contains или коллекцию const, если все значения являются константами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...