Как мне сравнить строку с огромным набором предопределенных строк в C #?

#c# #string

#c# #строка

Вопрос:

В программе на C # у меня есть String переменная, и я хочу сравнить ее, скажем, с сотней предопределенных (жестко закодированных) строковых литералов, чтобы я знал, соответствует ли она какой-либо из этих предопределенных строк.

Я, конечно, могу написать a switch или цепочку if-else if из s, но таким образом строки чередуются с управляющими операторами, и IMO, что снижает читаемость и упрощает установку ошибки.

Есть ли способ каким-то образом перечислить все строки так, чтобы они располагались в коде как можно ближе друг к другу?

Комментарии:

1. Что вы подразумеваете под перечислением всех строк , вы имеете в виду сканирование proj и поиск жестко закодированных литералов?

2. @V4Vendetta: Нет, я напишу их все сам.

Ответ №1:

Вы можете использовать HashSet (или Dictionary), а затем просто проверить, присутствует ключ или нет.

Комментарии:

1. Когда мне заполнять словарь?

2. @Sharptooth: Если у вас так много значений, я бы, вероятно, заполнил их из файла или базы данных в зависимости от вашего приложения. Если это невозможно, вы можете заполнить ее жестко закодированными строками.

3. Мой вопрос в том, когда мне запускать этот код заполнения. В C я бы просто объявил статический массив, и он был бы инициализирован при запуске программы абсолютно потокобезопасным способом — как мне удобно сделать это в C #?

4. @sharptooth: Я не знаю точно вашего кода, но вы могли бы создать hashset в статическом конструкторе класса, содержащего жестко запрограммированные строки…

Ответ №2:

Если нет другого способа, кроме как жестко закодировать строки, вы можете определить их в HashSet:

 var strs = new HashSet<string>{ "Str1","Str2","Str3" };
  

Игнорирование регистра :

 var strs = new HashSet<string>(StringComparer.OrdinalIgnoreCase) { "Str1","Str2","Str3" };
  

И :

 var found = strs.Contains(myVariable);
  

Комментарии:

1. В массиве содержится значение O (n), поэтому это может быть слишком дорого.

2. Понятия не имею о производительности linq в подобном случае, но в целом я бы предположил, что хэш, подобный предложенному Брайаном, быстрее.

3. Остерегайтесь Contains<T>(T s, IEqualityComparer<T> comparer), это метод расширения 🙂

Ответ №3:

На вашем месте я бы поместил все эти строки в List и провел это сравнение в foreach или contains .

Ответ №4:

Я подошел к этому двумя способами

  1. Используйте список и вызовите «содержит» или
  2. Используйте длинную строку (как string lits = "one|two|three" ), а затем найдите then call lits.indexOf(otherString "|") , если значение больше -1, то у вас есть совпадение…

Приветствия

CEC

  private const string _searched = "one|two|three";
        private void button1_Click(object sender, EventArgs e)
        {
            string search = "two"   "|";
            if (_searched.IndexOf(search) > -1)
            {
                //do something
            }
        }

        private List<string> _searchedList = new List<string>() { "one", "two", "three" };
        private void button2_Click(object sender, EventArgs e)
        {
            string search = "two";
            if (_searchedList.Contains(search))
            {
                //do something
            }
        }
  

Ответ №5:

Если производительность имеет первостепенное значение и если строки для поиска известны во время компиляции, вы можете создать минимальный идеальный хэш и сохранить строки в массиве.

 var stringTable = new[] { "The", "quick", "brown", ... };
var input = "fox";
var hash = ComputeMinimalPerfectHash(input);
var match = stringTable[hash];
if (input == match)
  // You have found a match.
  

Очевидно, что генерация кода для ComputeMinimalPerfectHash на основе строк является сложной частью.

Ответ №6:

Если этот список не меняется, вы помещаете их все в коллекцию и выполняете цикл по коллекции и сравниваете строки.

Использование оператора switch или if-else ifs было бы некорректным в случае ста случаев.

Ответ №7:

Создайте словарь (string, строка), добавьте все ваши предопределенные строки с ключом и значением в виде одной и той же строки. Вы можете использовать dictionary.Содержит функцию Key() для проверки, существует ли входная строка в словаре.

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

Ответ №8:

 List<String> strings = new List<String>{"String 1", "String 2", "String 3" ...}; 
if (strings.Contains(stringValue))
{         
}