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

kagorec

Client
Регистрация
24.08.2013
Сообщения
916
Благодарностей
471
Баллы
63
Здравствуйте.

Подскажите пожалуйста решение в виде снипета, который ищет слово в переменной и возвращает ответ "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)
 
Последнее редактирование:

kagorec

Client
Регистрация
24.08.2013
Сообщения
916
Благодарностей
471
Баллы
63
На форуме нашел такой вариант, но както работает странно
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";
}
Стандартным кубиком
 
Последнее редактирование:

Koqpe

Client
Регистрация
23.12.2014
Сообщения
1 100
Благодарностей
649
Баллы
113
Мне понравился такой снипет для поиска по большим спискам:
Добавим в 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

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
547
Баллы
93
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

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 941
Благодарностей
4 331
Баллы
113
Давно волновал этот вопрос.
Допустим есть черный список в txt.
В чём преимущества загонять его в список и построчно сравнивать или прочить этот txt в переменную и с помощью Contains проверить существование вхождения строки?
Скорость должна быть выше. Может быть какие-то неточности?
 
  • Спасибо
Реакции: kagorec

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
547
Баллы
93
и с помощью Contains проверить существование вхождения строки
Contains не подходит, в случаях, когда есть схожие вхождения, к примеру "site3.com не является bestsite3.com", выдаст наличие вхождения.
По этой причине необходимо проверять по точному вхождению через ==, для этого придется разделять на строки.
 
  • Спасибо
Реакции: kagorec

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 941
Благодарностей
4 331
Баллы
113
Contains не подходит, в случаях, когда есть схожие вхождения, к примеру "site3.com не является bestsite3.com", выдаст наличие вхождения.
Да, забыл уточнить, допустим известно, что черный список уникальных строк типа id или юзернеймов, что чаще всего и бывает.
 

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
547
Баллы
93
Да, забыл уточнить, допустим известно, что черный список уникальных строк типа id или юзернеймов, что чаще всего и бывает.
тогда можно одной строкой чекнуть, даже в локи можно не оборачивать, если только читаем

C#:
if (File.ReadAllLines(@"C:\blacklist.txt").Where(arg => !string.IsNullOrWhiteSpace(arg)).Contains("site4.com")) return "y";
 
  • Спасибо
Реакции: kagorec и Astraport

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 941
Благодарностей
4 331
Баллы
113
тогда можно одной строкой чекнуть, даже в локи можно не оборачивать, если только читаем
К одной строке нет желания стремится. Меня волнует этот метод только на предмет возможных ошибок. Насколько он надёжен?
 

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
547
Баллы
93
Меня волнует этот метод только на предмет возможных ошибок. Насколько он надёжен?
В моей практике не было ни одного случая, чтобы конструкция выдала ошибку. Другой вопрос, если файл большого размера, сотни мегабайт. Тогда это долго, и необходимо обращаться к другим методам.
 
  • Спасибо
Реакции: Astraport

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63
На выходе или 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";
 

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