Подтвердить что ты не робот

Лучший способ проверить строку в списке с разделителями-запятыми с .NET?

Я читаю список строк с разделителями-запятыми из файла конфигурации. Мне нужно проверить, есть ли в этом списке другая строка. Например:

"apple,banana,cheese"

Если я проверяю на "apple", я должен его найти, но если я проверю на "app", я не должен.

Какой самый простой и лаконичный способ сделать это? Это не должно быть быстрым.

(Я добавлю свое решение в качестве ответа, но я надеюсь, что у кого-то есть что-то лучше.)

4b9b3361

Ответ 1

Использование linq:

listString.Split(',').Contains("apple")

W/o linq:

Array.IndexOf(listString.Split(','), "apple") >= 0

Ответ 2

(","+listString+",").Contains(","+testWord+",");

но не прямолинейно.

Ответ 3

Regex, вероятно, не считается "прямым", но это то, что у меня есть:

Regex.IsMatch(listString, "(?<=,|^)" + testWord + "(?=,|$)")

Обновление: Комментарий от пользователя Eric ниже:

Regex.IsMatch(listString, "(?<=,|^)" + Regex.Escape(testWord) + "(?=,|$)")

Ответ 5

Это работает, но регулярные выражения довольно медленны, если они усложняются. Тем не менее, привязка к границе слова делает это довольно простым.

var foods = "apple,banana,cheese";

var match = Regex.Match(foods, @"\bapple\b");

if (match.Success)
    Console.WriteLine(match.Value);

Ответ 6

Здесь опция, которая игнорирует регистр.

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);

Ответ 7

Ответ зависит от того, какие правила синтаксиса для вашего списка с разделителями-запятыми.

Если правила требуют, чтобы список был точно таким, как вы опубликовали (без пробелов, без конечной запятой), тогда задача может быть разбита на части компонента:

Строка начинается с apple,? (String.StartsWith)
Строка заканчивается на ,apple? (String.EndsWith)
Строка содержит ,apple,? (String.Contains)

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

Если вы проверяете множество элементов в одной строке, вам нужно просто преобразовать строку в список, который вы кешируете, а затем проверяете. Метод String.Split сделает это за вас.

Ответ 8

Это решение для игнорирования случая и культуры (или выберите одно из свойств 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
}

Ответ 9

                 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;
    }