Ответ 1
Использование linq:
listString.Split(',').Contains("apple")
W/o linq:
Array.IndexOf(listString.Split(','), "apple") >= 0
Я читаю список строк с разделителями-запятыми из файла конфигурации. Мне нужно проверить, есть ли в этом списке другая строка. Например:
"apple,banana,cheese"
Если я проверяю на "apple"
, я должен его найти, но если я проверю на "app"
, я не должен.
Какой самый простой и лаконичный способ сделать это? Это не должно быть быстрым.
(Я добавлю свое решение в качестве ответа, но я надеюсь, что у кого-то есть что-то лучше.)
Использование linq:
listString.Split(',').Contains("apple")
W/o linq:
Array.IndexOf(listString.Split(','), "apple") >= 0
(","+listString+",").Contains(","+testWord+",");
но не прямолинейно.
Regex, вероятно, не считается "прямым", но это то, что у меня есть:
Regex.IsMatch(listString, "(?<=,|^)" + testWord + "(?=,|$)")
Обновление: Комментарий от пользователя Eric ниже:
Regex.IsMatch(listString, "(?<=,|^)" + Regex.Escape(testWord) + "(?=,|$)")
Другим способом может быть использование
bool contains = new List<string>("apple,banana,cheese".Split(',')).Contains("apple");
//or
bool b = "apple,banana,cheese".Split(',').Contains("apple");
Это работает, но регулярные выражения довольно медленны, если они усложняются. Тем не менее, привязка к границе слова делает это довольно простым.
var foods = "apple,banana,cheese";
var match = Regex.Match(foods, @"\bapple\b");
if (match.Success)
Console.WriteLine(match.Value);
Здесь опция, которая игнорирует регистр.
var food = "apple,banana,cheese";
bool containsApp = food.Split(',')
.Where(s => string.Compare("app", s, true) == 0)
.Count() > 0;
bool containsApple = food.Split(',')
.Where(s => string.Compare("apple", s, true) == 0)
.Count() > 0;
Console.WriteLine("Contains \"app\"? {0}", containsApp);
Console.WriteLine("Contains \"apple\"? {0}", containsApple);
Ответ зависит от того, какие правила синтаксиса для вашего списка с разделителями-запятыми.
Если правила требуют, чтобы список был точно таким, как вы опубликовали (без пробелов, без конечной запятой), тогда задача может быть разбита на части компонента:
Строка начинается с apple,
? (String.StartsWith)
Строка заканчивается на ,apple
? (String.EndsWith)
Строка содержит ,apple,
? (String.Contains)
Если правила сложнее, подход Regex становится единственным способом без полной обработки списка или написания кучи правил.
Если вы проверяете множество элементов в одной строке, вам нужно просто преобразовать строку в список, который вы кешируете, а затем проверяете. Метод String.Split сделает это за вас.
Это решение для игнорирования случая и культуры (или выберите одно из свойств StringComparer
)
var commaDelimitedString = "string1,string2,string3,string4";
var testString = string2.trim; // trim to remove the spaces coz you may be getting it from UI
if(commaDelimitedString.split(',').contains(testString,StringComparer.InvariantCultureIgnoreCase))
{
//TODO: What to do when condition is true
}
else
{
//TODO: What to do when condition is false
}
public bool GetIsExistSubstring(string mainstring, string substring)
{
bool Isexist=false;
int i = -1;
mainstring = string.Format(",{0},", mainstring);//so it will be like ,1,2,3,
substring = string.Format(",{0},", substring);//so it will be like ,1,
i=mainstring.IndexOf(substring);
if(i!=-1)
{
Isexist = true;
}
return Isexist;
}