Предполагая, что под "эффективным" вы имеете в виду быстрый, каждый раз, когда вы ищете строку в коллекции строк, и эта коллекция, вероятно, будет содержать более нескольких записей, вы всегда должны использовать поиск хеша.Простое сканирование списка занимает экспоненциальное время, так как количество элементов увеличивается, в то время как количество мало влияет на поиск хеша.В .NET это традиционно обрабатывается классом Dictionary, который обычно используется для индексации коллекции объектов с ключом (который часто является строкой).Однако значение не может быть нулевым, и это привело к передаче одной и той же строки как ключа, так и значения - довольно уродливо.Наконец, .NET 4 предоставил HashSet, который вы должны использовать в таком случае, если у вас есть только ключ и значение, а не значение.
В вашем случае (не редкость) возникает ситуация, когда требуется сравнение без учета регистра,Распространенным решением для этого является строчная строковых ключей при добавлении их в словарь (или HashSet).Эти крошечные накладные расходы на добавление значительно перевешиваются экономией на поисках, поскольку все программисты должны знать и понимать, что сравнения без учета регистра значительно медленнее, чем с учетом регистра, особенно с Unicode - процессор не может просто выполнить сравнение блоков данных, но должен проверять каждую пару символов специально (даже при поиске в таблице, это значительно медленнее).
Если ваши псевдонимы могут быть в нижнем регистре, измените их с List на HashSet.Если нет, используйте Словарь, где ключ добавляется в нижнем регистре, а значение - это строка псевдонима (смешанный регистр).Если предположить использование словаря, ваш код будет выглядеть так:
public Commands HasCommand(string cmd)
{
foreach (Commands item in AllowedCommands)
{
if (item.Alias.ContainsKey(cmd))
return item;
}
return null;
}
Наконец, также в отношении производительности, использование LINQ почти всегда приведет к снижению производительности - где-то между немного медленнее и намного медленнеев зависимости от ситуации.Это действительно хороший, компактный источник для простых вещей, и я использую его довольно часто, но если вы уверены, что производительность является проблемой для фрагмента кода, вы, вероятно, не должны его использовать (если только это не PLINQ,конечно).
Итак, если вам нужно как можно меньше строк кода, используйте другой ответ, размещенный здесь.Если вам нужна скорость, используйте мой.
Это почти само собой разумеется, но когда вы беспокоитесь о производительности некоторого небольшого куска кода, подобного этому, просто оберните его в цикл for и повторяйте его до тех пор, покавыполнение занимает 5-10 секунд - просто добавьте порядки по мере необходимости, будь то 1000 или 1 000 000 повторений, и добавьте время с помощью System.Diagnostics.Stopwatch.Попробуйте альтернативную логику и повторите тест.5-10 секунд - это минимум, предназначенный для маскировки колебаний, вызванных управляемой средой и другими компонентами, выполняющимися на той же машине (очевидно, следует также избегать запуска других приложений во время теста).Конечно, для общего тестирования производительности сложного приложения рекомендуется использовать инструмент для анализа производительности.