Как сравнить строку с огромным набором предопределенных строк в C #? - PullRequest
3 голосов
/ 13 апреля 2011

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

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

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

Ответы [ 8 ]

8 голосов
/ 13 апреля 2011

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

5 голосов
/ 13 апреля 2011

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

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

Игнорирование дела:

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

А:

var found = strs.Contains(myVariable);
3 голосов
/ 13 апреля 2011

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

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 на основе строк - сложная часть.

3 голосов
/ 13 апреля 2011

Два способа приблизиться к этому

  1. Использовать список и вызывать «содержит» или
  2. Использовать длинную строку (как string lits = "one|two|three"), а затем найти, затем вызвать 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
            }
        }
3 голосов
/ 13 апреля 2011

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

2 голосов
/ 13 апреля 2011
List<String> strings = new List<String>{"String 1", "String 2", "String 3" ...}; 
if (strings.Contains(stringValue))
{         
} 
2 голосов
/ 13 апреля 2011

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

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

2 голосов
/ 13 апреля 2011

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

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

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