Снипет C# - поиск слова в переменной

kagorec

Client
Регистрация
24.08.2013
Сообщения
1 136
Реакции
654
Баллы
113
Здравствуйте.

Подскажите пожалуйста решение в виде снипета, который ищет слово в переменной и возвращает ответ "yes" или "no":

1. В зенношаблоне есть входящие настройки с текстовым значением где построчно указаны определенные домены, переменная "whitelist"
site1.ru
site2.net
site3.com
site4.com
2. Во время выполнения шаблона, переменная "domain" имеет значение в виде домена (пример site3.com )
2. Требуется во время работы шаблона выполнить условие - если в переменой "whitelist" где построчно много разных доменов, есть такой же домен как в переменной "domain" то возвращается ответ "yes" (в противном случае "no")

Важно чтоб проверка была на точное вхождение (избежать нюансов когда изза частичного вхождения могут быть проблемы, например site3.com не является bestsite3.com)
 
Последнее редактирование:
На форуме нашел такой вариант, но както работает странно
C#:
Развернуть Свернуть Копировать
string pattern = project.Variables["name"].Value; // John
string text = project.Variables["text"].Value; // Variable 1

if (!string.IsNullOrWhiteSpace(Regex.Match(text, pattern).Value)) {
    return "Yes";
} else {
    return "No";
}

Как то так
Код:
Развернуть Свернуть Копировать
var per = project.Variables["111"].Value;
if (per.Contains(project.Variables["222"].Value))
{
return "Yes";
}
else
{
return "No";
}

Стандартным кубиком
 
Последнее редактирование:
Мне понравился такой снипет для поиска по большим спискам:
Добавим в using
C#:
Развернуть Свернуть Копировать
using System.Threading.Tasks;
C#:
Развернуть Свернуть Копировать
string url = project.Variables["url"].Value;
bool status = false;
IZennoList list = project.Lists["BL"];
Parallel.ForEach<string>(list, el => {
    //project.SendInfoToLog(el);
    if (el == url){
    status = true;
    }
});
return status;
Проверка на наличие в Black List с помощью цикла Parallel.For из этой статьи.
 
  • Спасибо
Реакции: kagorec
C#:
Развернуть Свернуть Копировать
List<string> lst = new List<string>();

lst.AddRange(project.Variables["whitelist"].Value.Split(new[] {"\r\n"}, StringSplitOptions.None));

for (int d = 0; d < lst.Count; d++) {
    if (lst[d] == project.Variables["domain"].Value) {
        project.SendInfoToLog("yes",true);
        break;
    } else if (d == lst.Count - 1) project.SendInfoToLog("nope",true);
}
 
  • Спасибо
Реакции: kagorec
Давно волновал этот вопрос.
Допустим есть черный список в txt.
В чём преимущества загонять его в список и построчно сравнивать или прочить этот txt в переменную и с помощью Contains проверить существование вхождения строки?
Скорость должна быть выше. Может быть какие-то неточности?
 
  • Спасибо
Реакции: kagorec
и с помощью Contains проверить существование вхождения строки
Contains не подходит, в случаях, когда есть схожие вхождения, к примеру "site3.com не является bestsite3.com", выдаст наличие вхождения.
По этой причине необходимо проверять по точному вхождению через ==, для этого придется разделять на строки.
 
  • Спасибо
Реакции: kagorec
Contains не подходит, в случаях, когда есть схожие вхождения, к примеру "site3.com не является bestsite3.com", выдаст наличие вхождения.
Да, забыл уточнить, допустим известно, что черный список уникальных строк типа id или юзернеймов, что чаще всего и бывает.
 
Да, забыл уточнить, допустим известно, что черный список уникальных строк типа id или юзернеймов, что чаще всего и бывает.
тогда можно одной строкой чекнуть, даже в локи можно не оборачивать, если только читаем

C#:
Развернуть Свернуть Копировать
if (File.ReadAllLines(@"C:\blacklist.txt").Where(arg => !string.IsNullOrWhiteSpace(arg)).Contains("site4.com")) return "y";
 
  • Спасибо
Реакции: kagorec и Astraport
тогда можно одной строкой чекнуть, даже в локи можно не оборачивать, если только читаем
К одной строке нет желания стремится. Меня волнует этот метод только на предмет возможных ошибок. Насколько он надёжен?
 
Меня волнует этот метод только на предмет возможных ошибок. Насколько он надёжен?
В моей практике не было ни одного случая, чтобы конструкция выдала ошибку. Другой вопрос, если файл большого размера, сотни мегабайт. Тогда это долго, и необходимо обращаться к другим методам.
 
  • Спасибо
Реакции: Astraport
На выходе или null или найденная строка
C#:
Развернуть Свернуть Копировать
string id = "12345";
List<string> list = new List<string>(project.Lists["list"]);
string value = list.AsParallel().FirstOrDefault(s => s.Equals(id));
if(value == null) return "0";
 

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)