Найти строку в списке по вхождению и добавить в переменную

DevOps

Client
Регистрация
30.11.2020
Сообщения
496
Благодарностей
313
Баллы
63
Здравствуйте. Подскажите пожалуйста строчку кода.
Есть список In который содержит строки с разделителями
Код:
kamy520,res,pdp2
kamy599,trs,111
luxury712,old20,78a
........ и.т.д.
Нужно получить строку по списку по первому вхождению и передать в переменную, например resultat. Строку должна передаваться целиком
Накидал код который делает поиск, но как передавать результат в переменную что то никак не соображу
Образец говнокода
C#:
///////////
var list = project.Lists["In"];
for(int i=0; i<list1.Count; i++)
{
   if ( list1.Contains("kamy520") == true );
}
//////////////
Подскажите кусок кода чтобы результат поиска передавался в переменную resultat
Спасибо.
 
Последнее редактирование модератором:

evgen_po

Client
Регистрация
27.08.2013
Сообщения
847
Благодарностей
528
Баллы
93
Код:
return list[i];
 
  • Спасибо
Реакции: DevOps

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
19 461
Благодарностей
8 686
Баллы
113
@DevOps Попробуйте такой снипет:
C#:
// берем из переменной текст, который надо искать
var textContains = project.Variables["txt"].Value;
// получаем список, в котором будем искать
var sourceList = project.Lists["Список 1"];
// ищем в каждой строчке в списке
lock(SyncObjects.ListSyncer)
{
    for(int i=0; i < sourceList.Count; i++)
    {
        // читаем строку из списка
        var str = sourceList[i];
        // проверяем содержание текста в строке, если есть совпадение возвращаем "yes"
        if (str.Contains(textContains))
            //return "yes";
            return str;
    }
}
// если ничего не нашли возвращаем "no"
return "no";
 
  • Спасибо
Реакции: DevOps

DevOps

Client
Регистрация
30.11.2020
Сообщения
496
Благодарностей
313
Баллы
63
@DevOps Попробуйте такой снипет:
C#:
// берем из переменной текст, который надо искать
var textContains = project.Variables["txt"].Value;
// получаем список, в котором будем искать
var sourceList = project.Lists["Список 1"];
// ищем в каждой строчке в списке
lock(SyncObjects.ListSyncer)
{
    for(int i=0; i < sourceList.Count; i++)
    {
        // читаем строку из списка
        var str = sourceList[i];
        // проверяем содержание текста в строке, если есть совпадение возвращаем "yes"
        if (str.Contains(textContains))
            //return "yes";
            return str;
    }
}
// если ничего не нашли возвращаем "no"
return "no";
Данный код отрабатывает и в логе показывает то что находит. Полную строку. Но не могу понять куда записывается данный результат кроме лога? Мне его дальше по конвейеру надо отправить :(
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
19 461
Благодарностей
8 686
Баллы
113
Данный код отрабатывает и в логе показывает то что находит. Полную строку. Но не могу понять куда записывается данный результат кроме лога? Мне его дальше по конвейеру надо отправить
Можете в C# кубике прописать вых. переменную, либо используете переменную str дальше в коде. Если надо сразу присвоить строку в переменную проекта, то вместо "return str;" пропишите "project.Variables["findedline"].Value = str;"
 
  • Спасибо
Реакции: DevOps

DevOps

Client
Регистрация
30.11.2020
Сообщения
496
Благодарностей
313
Баллы
63
Можете в C# кубике прописать вых. переменную, либо используете переменную str дальше в коде. Если надо сразу присвоить строку в переменную проекта, то вместо "return str;" пропишите "project.Variables["findedline"].Value = str;"
Спасибо. теперь понял. После PowerShell немного путаюсь. Вроде .NET
 
  • Спасибо
Реакции: Sergodjan

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 763
Благодарностей
2 401
Баллы
113
Есть список In который содержит строки с разделителями
Код:
kamy520,res,pdp2
kamy599,trs,111
luxury712,old20,78a
........ и.т.д.
Нужно получить строку по списку по первому вхождению
передать в переменную, например resultat.
Строку должна передаваться целиком
C#:
string line = "kamy520";
List<string> list = new List<string>(){
    "kamy520,res,pdp2",
    "kamy599,trs,111",
    "luxury712,old20,78a"
};
string out_line = string.Empty;
//    out_line = list.Where(x => x.Split(',')[0] == line).DefaultIfEmpty("Значение если ничего нет").FirstOrDefault(); // Полное вхождение
out_line = list.Where(x => x.Split(',')[0].Contains(line)).DefaultIfEmpty("Значение если ничего нет").FirstOrDefault(); // Частичное вхождение

// читается примерно так:
// Возьми из списка list
// Все строки
// Каждую строку разбей по разделителю запятая, и сравни первый элемент полученного массива со строкой на полное или частичное вхождение
// Из строк, которые удовлетворяют условиям возьми первое значение, либо верни указанное значение (если в результате не оказалось ни одной строки)

// Решил дополнить комментарии, подумал мало ли, вдруг кто-то с такими LINQ конструкциями не знаком...


// project.Variables["line"].Value = out_line; // Вернуть в переменную ЗЕнно
project.SendInfoToLog(out_line,true); // Вывести в лог
P.S. Подправил код, добавил .DefaultIfEmpty("Значение если ничего нет") в конструкцию, чтобы не выбрасывало ошибку, если не найден ни один элемент. Естественно, значение внутри можно поставить любое.
 
Последнее редактирование:
  • Спасибо
Реакции: Ilshakin, DevOps и Alexmd

DevOps

Client
Регистрация
30.11.2020
Сообщения
496
Благодарностей
313
Баллы
63
C#:
string line = "kamy520";
List<string> list = new List<string>(){
    "kamy520,res,pdp2",
    "kamy599,trs,111",
    "luxury712,old20,78a"
};
string out_line = string.Empty;
//    out_line = list.Where(x => x.Split(',')[0] == line).DefaultIfEmpty("Значение если ничего нет").FirstOrDefault(); // Полное вхождение
out_line = list.Where(x => x.Split(',')[0].Contains(line)).DefaultIfEmpty("Значение если ничего нет").FirstOrDefault(); // Частичное вхождение

// project.Variables["line"].Value = out_line; // Вернуть в переменную ЗЕнно
project.SendInfoToLog(out_line,true); // Вывести в лог
P.S. Подправил код, добавил .DefaultIfEmpty("Значение если ничего нет") в конструкцию, чтобы не выбрасывало ошибку, если не найден ни один элемент. Естественно, значение внутри можно поставить любое.
Обязательно протестю Отдельная уважуха за
out_line = list.Where(x => x.Split(',')[0].Contains(line)).DefaultIfEmpty("Значение если ничего нет").FirstOrDefault(); // Частичное вхождение
Лямбды так и норовят "стопорнуть" код, даже при обычной орфографической ошибке :-)))
 
  • Спасибо
Реакции: BAZAg

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 763
Благодарностей
2 401
Баллы
113
Обязательно протестю Отдельная уважуха за
out_line = list.Where(x => x.Split(',')[0].Contains(line)).DefaultIfEmpty("Значение если ничего нет").FirstOrDefault(); // Частичное вхождение
Лямбды так и норовят "стопорнуть" код, даже при обычной орфографической ошибке :-)))
Данный код не должен выдавать ошибок.
Но, если вдруг придётся проверять не x.Split(',')[0] и например x.Split(',')[1], и попадётся строка, которая не содержит x.Split(',')[1] - то думаю получим ошибку.
Индекс находился вне границ массива.
В этом случае возможно необходимо добавить условие, есть ли достаточно элементов после разделения, например как-то так:
пример если нужно проверять не нулевой элемент после разделения:
out_line = list.Where(x => {
    string[] temp_x = x.Split(',');
    if(temp_x.Length > 1){
        return temp_x[1].Contains(line);
    }
    else {
        return false;
    }
}).DefaultIfEmpty("").FirstOrDefault(); // Частичное вхождение
 
  • Спасибо
Реакции: DevOps

DevOps

Client
Регистрация
30.11.2020
Сообщения
496
Благодарностей
313
Баллы
63
Данный код не должен выдавать ошибок.
Но, если вдруг придётся проверять не x.Split(',')[0] и например x.Split(',')[1], и попадётся строка, которая не содержит x.Split(',')[1] - то думаю получим ошибку.
Индекс находился вне границ массива.
В этом случае возможно необходимо добавить условие, есть ли достаточно элементов после разделения, например как-то так:
пример если нужно проверять не нулевой элемент после разделения:
out_line = list.Where(x => {
    string[] temp_x = x.Split(',');
    if(temp_x.Length > 1){
        return temp_x[1].Contains(line);
    }
    else {
        return false;
    }
}).DefaultIfEmpty("").FirstOrDefault(); // Частичное вхождение
Количество индексов в строках - одинаковое. Вылета не должно быть, если только из за рукожопости, но тут никакой код не спасет :-)
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 763
Благодарностей
2 401
Баллы
113
Количество индексов в строках - одинаковое. Вылета не должно быть, если только из за рукожопости, но тут никакой код не спасет :-)
Бывает так, что чисто по стечению обстоятельств в список добавляется пустая строка (или например считывается файл, который содержит пустую последнюю строку). При разделении по запятой мы в любом случае получим 1 элемент. А вот 2 получить в этом случае не получится... Из-за чего прежде тогда нужно помнить, что нужно удалять пустые строки... Или внедрять в код конструкции, как выше, чтобы исключить возможность пустые строки вывести наш шаблон из строя :-)
Хотя... Вы правы - не всегда получается за всем уследить!
Хорошего дня!
 
  • Спасибо
Реакции: DevOps

DevOps

Client
Регистрация
30.11.2020
Сообщения
496
Благодарностей
313
Баллы
63
C#:
string line = "kamy520";
List<string> list = new List<string>(){
    "kamy520,res,pdp2",
    "kamy599,trs,111",
    "luxury712,old20,78a"
};
string out_line = string.Empty;
//    out_line = list.Where(x => x.Split(',')[0] == line).DefaultIfEmpty("Значение если ничего нет").FirstOrDefault(); // Полное вхождение
out_line = list.Where(x => x.Split(',')[0].Contains(line)).DefaultIfEmpty("Значение если ничего нет").FirstOrDefault(); // Частичное вхождение

// читается примерно так:
// Возьми из списка list
// Все строки
// Каждую строку разбей по разделителю запятая, и сравни первый элемент полученного массива со строкой на полное или частичное вхождение
// Из строк, которые удовлетворяют условиям возьми первое значение, либо верни указанное значение (если в результате не оказалось ни одной строки)

// Решил дополнить комментарии, подумал мало ли, вдруг кто-то с такими LINQ конструкциями не знаком...


// project.Variables["line"].Value = out_line; // Вернуть в переменную ЗЕнно
project.SendInfoToLog(out_line,true); // Вывести в лог
P.S. Подправил код, добавил .DefaultIfEmpty("Значение если ничего нет") в конструкцию, чтобы не выбрасывало ошибку, если не найден ни один элемент. Естественно, значение внутри можно поставить любое.
Добрый вечер. Подскажите, на что изменить Contains в Вашем коде, что бы поиск соответствия был 100% соответствующим?
PSСорри, видимо слепота на закомментированные строки, увидел решение :-)
 
Последнее редактирование:

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63
Добрый вечер. Подскажите, на что изменить Contains в Вашем коде, что бы поиск соответствия был 100% соответствующим?
PSСорри, видимо слепота на закомментированные строки, увидел решение :-)
Equals
 
  • Спасибо
Реакции: DevOps

DevOps

Client
Регистрация
30.11.2020
Сообщения
496
Благодарностей
313
Баллы
63
  • Спасибо
Реакции: SergSh

seowin

Client
Регистрация
02.05.2016
Сообщения
106
Благодарностей
9
Баллы
18
Потерто..
 

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