#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:
Я подошел к этому двумя способами
- Используйте список и вызовите «содержит» или
- Используйте длинную строку (как
string lits = "one|two|three"
), а затем найдите then calllits.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))
{
}