В vb.net или C # я ожидал бы, что самый быстрый общий подход для сравнения переменной с любым разумным количеством объектов с индивидуальным именем (в отличие, например, от всех вещей в коллекции) будет состоять в простом сравнении каждого объекта с сравните многое, как вы сделали. Конечно, можно создать экземпляр коллекции и посмотреть, содержит ли он объект, и это может быть более выразительным, чем сравнение объекта со всеми элементами по отдельности, но если только не используется конструкция, которую компилятор может явно распознать, такой код почти наверняка будет намного медленнее, чем просто делать отдельные сравнения. Я не стал бы беспокоиться о скорости, если код по своей природе будет работать не более нескольких сотен раз в секунду, но я бы опасался, что код будет перенаправлен на что-то, что выполняется гораздо чаще, чем предполагалось изначально.
Альтернативный подход, если переменная является чем-то вроде типа перечисления, заключается в выборе значений перечисления со степенью двойки, чтобы разрешить использование битовых масок. Если тип перечисления имеет 32 или менее допустимых значений (например, начиная с Гарри = 1, Рон = 2, Гермиона = 4, Джинни = 8, Невилл = 16), можно сохранить их в целое число и проверить несколько битов одновременно в одном операция ((if ((thisOne & (Harry | Ron | Neville | Beatrix))! = 0) / * Сделайте что-нибудь * /. Это позволит быстро кодировать, но ограничено перечислениями с небольшим количеством значений.
Несколько более мощный подход, но который следует использовать с осторожностью, заключается в использовании некоторых битов значения для указания атрибутов чего-либо, в то время как другие биты идентифицируют элемент. Например, бит 30 может указывать, что символ является мужчиной, бит 29 может указывать на друга Гарри и т. Д., В то время как младшие биты различают символы. Этот подход позволил бы добавлять персонажей, которые могут быть или не быть друзьями Гарри, не требуя изменения кода, проверяющего друга Гарри. Одним из предостережений при выполнении этого является то, что нужно различать константы перечисления, которые используются для установки значения перечисления, и те, которые используются для ТЕСТИРОВАНИЯ его. Например, чтобы установить переменную, указывающую на Гарри, можно задать для нее значение 0x60000001, но, чтобы увидеть, является ли переменная Гарри, нужно проверить ее с помощью 0x00000001.
Еще один подход, который может быть полезен, если общее число возможных значений является умеренным (например, 16-16 000 или около того), должен иметь массив флагов, связанных с каждым значением. Затем можно написать что-то вроде «if (((characterAttributes [theCharacter] & chracterAttribute.Male)! = 0)». Этот подход будет работать лучше всего, когда количество символов довольно мало. Если массив слишком велик, пропадание кэша может замедлиться код до такой степени, что тестирование по небольшому количеству символов по отдельности будет быстрее.