C# поиск по списку

inotoxic

Client
Регистрация
20.04.2015
Сообщения
354
Благодарностей
162
Баллы
43
Есть снипет поиска строки в списке
Код:
// берем из переменной текст, который надо искать
var textContains = project.Variables["URL_magazine"].Value;
// получаем список, в котором будем искать
var sourceList = project.Lists["Black_list"];
// ищем в каждой строчке в списке
lock(SyncObjects.ListSyncer)
{
    for(int i=0; i < sourceList.Count; i++)
    {
        // читаем строку из списка
        var str = sourceList[i];
        // проверяем содержание текста в строке, если есть совпадение возвращаем "yes"
        if (str.Contains(textContains))
        {

return "yes";
}
}
}
// если ничего не нашли возвращаем "no"
return "no";


Так например, если в списке "Black_list" есть строки:
aska-realty
mor-realty
etagi
sochi-realinvest
incom_realty
floorsgroup

А переменная "URL_magazine" имеет значение incom, то снипет определяет, что в списке уже есть похожее значение.

Как нужно изменить код, чтобы отрабатывало по полному соответствию строки, а не по части совпадения?
 

evgen_po

Client
Регистрация
27.08.2013
Сообщения
847
Благодарностей
528
Баллы
93
Код:
// берем из переменной текст, который надо искать
var textContains = project.Variables["URL_magazine"].Value;
// получаем список, в котором будем искать
var sourceList = project.Lists["Black_list"];
// ищем в каждой строчке в списке
lock(SyncObjects.ListSyncer)
{
    for(int i=0; i < sourceList.Count; i++)
    {
        // читаем строку из списка
        var str = sourceList[i];
        // проверяем содержание текста в строке, если есть совпадение возвращаем "yes"
        if (str == textContains)
        {


return "yes";
}
}
}
// если ничего не нашли возвращаем "no"
return "no";
так должно работать
 

inotoxic

Client
Регистрация
20.04.2015
Сообщения
354
Благодарностей
162
Баллы
43

evgen_po

Client
Регистрация
27.08.2013
Сообщения
847
Благодарностей
528
Баллы
93
Так не работает.
Тот же результат.
Работает, проверил на твоих примерах. Может опять первый код вставил? Там разница в 13 строчке и все - проверь. Потому как этот код ищет по полному совпадению, а не по вхождению.
 
Последнее редактирование:
  • Спасибо
Реакции: inotoxic

inotoxic

Client
Регистрация
20.04.2015
Сообщения
354
Благодарностей
162
Баллы
43
Да, ты прав - нет тот код скопировал.
Еще дважды перепроверил.
Спасибо!
 

Konrod_m

Client
Регистрация
18.09.2014
Сообщения
1 660
Благодарностей
918
Баллы
113
Почти аналогичный случай,

надо найти и переложить не совпадающие элементы, а точное совпадение.

Может кто-нибудь подсказать, что надо изменить?

Код:
// берем регулярное выражение для парсинга из переменной
var parserRegexPattern = project.Variables["listSearchRegex"].Value;
var parserRegex = new System.Text.RegularExpressions.Regex(parserRegexPattern);
// получаем список, в котором будем искать
var sourceList = project.Lists["SourceList"];
// получаем список, в который будем класть
var destList = project.Lists["OutputList"];
// ищем в каждой строчке в списке
lock(SyncObjects.ListSyncer)
{
    for(int i=0; i < sourceList.Count; i++)
    {
        // читаем строку из списка
        var str = sourceList[i];
        // проверяем строку регулярным выражением, если есть совпадение кладем результат во второй список
        if (parserRegex.IsMatch(str))
        {
            destList.Add(str);     
        }
    }
}
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 605
Благодарностей
4 596
Баллы
113
может быть parserRegex.IsMatch(str) заменить на !parserRegex.IsMatch(str)
 

evgen_po

Client
Регистрация
27.08.2013
Сообщения
847
Благодарностей
528
Баллы
93
Почти аналогичный случай,

надо найти и переложить не совпадающие элементы, а точное совпадение.

Может кто-нибудь подсказать, что надо изменить?

Код:
// берем регулярное выражение для парсинга из переменной
var parserRegexPattern = project.Variables["listSearchRegex"].Value;
var parserRegex = new System.Text.RegularExpressions.Regex(parserRegexPattern);
// получаем список, в котором будем искать
var sourceList = project.Lists["SourceList"];
// получаем список, в который будем класть
var destList = project.Lists["OutputList"];
// ищем в каждой строчке в списке
lock(SyncObjects.ListSyncer)
{
    for(int i=0; i < sourceList.Count; i++)
    {
        // читаем строку из списка
        var str = sourceList[i];
        // проверяем строку регулярным выражением, если есть совпадение кладем результат во второй список
        if (parserRegex.IsMatch(str))
        {
            destList.Add(str);  
        }
    }
}
Код:
// берем переменную для полного совпадения
var parserPattern = project.Variables["listSearchRegex"].Value;
// не превращаем в регулярное выражение
// получаем список, в котором будем искать
var sourceList = project.Lists["SourceList"];
// получаем список, в который будем класть
var destList = project.Lists["OutputList"];
// ищем в каждой строчке в списке
lock(SyncObjects.ListSyncer)
{
    for(int i=0; i < sourceList.Count; i++)
    {
        // читаем строку из списка
        var str = sourceList[i];
        // проверяем строку на полное совпадение, если есть совпадение кладем результат во второй список
        if (str == parserPattern)
        {
            destList.Add(str);
        }
    }
}
 
Последнее редактирование:
  • Спасибо
Реакции: Karamzin и CSS

Nightgarm

Client
Регистрация
06.09.2014
Сообщения
22
Благодарностей
8
Баллы
3
Подскажите, а как сделать что бы в списке "SourceList" поиск происходил не до первого совпадения, а считал количество строчек совпадающих со значением из переменной "listSearchRegex". И если количество найденных строчек больше или равно числу из переменной "dubli", то записывает значение переменной "listSearchTextContains" в список "OutputList".

Код:
// берем переменную для полного совпадения
var parserPattern = project.Variables["listSearchRegex"].Value;
// не превращаем в регулярное выражение
// берем переменную отвечающую за нужное количество найденных дублей
var parserPattern = project.Variables["dubli"].Value;
// получаем список, в котором будем искать
var sourceList = project.Lists["SourceList"];
// получаем список, в который будем класть
var destList = project.Lists["OutputList"];
 

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 500
Благодарностей
1 263
Баллы
113
Если я правильно понял
C#:
// берем переменную для полного совпадения
var parserPattern = project.Variables["listSearchRegex"].Value;
// не превращаем в регулярное выражение
// берем переменную отвечающую за нужное количество найденных дублей
var dubli = project.Variables["dubli"].Value;
// получаем список, в котором будем искать
var sourceList = project.Lists["SourceList"];
// получаем список, в который будем класть
var destList = project.Lists["OutputList"];

var sovpad = sourceList.Where(x => Regex.IsMatch(x, parserPattern)).ToList(); // Все совпадения пихаем в список
if (sovpad.Count()>0 || sovpad.Count()>dubli.Count())
    destList.AddRange(sovpad);
 

Nightgarm

Client
Регистрация
06.09.2014
Сообщения
22
Благодарностей
8
Баллы
3
Если я правильно понял
C#:
// берем переменную для полного совпадения
var parserPattern = project.Variables["listSearchRegex"].Value;
// не превращаем в регулярное выражение
// берем переменную отвечающую за нужное количество найденных дублей
var dubli = project.Variables["dubli"].Value;
// получаем список, в котором будем искать
var sourceList = project.Lists["SourceList"];
// получаем список, в который будем класть
var destList = project.Lists["OutputList"];

var sovpad = sourceList.Where(x => Regex.IsMatch(x, parserPattern)).ToList(); // Все совпадения пихаем в список
if (sovpad.Count()>0 || sovpad.Count()>dubli.Count())
    destList.AddRange(sovpad);

Благодарю за помощь!

В логе пишет - ошибка "Regex" отсутствует в текущем контексте строка: 11; столбец: 36
 

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 500
Благодарностей
1 263
Баллы
113
добавь в директиву using следующее
using System.Text.RegularExpressions;
 

Nightgarm

Client
Регистрация
06.09.2014
Сообщения
22
Благодарностей
8
Баллы
3
добавь в директиву using следующее
using System.Text.RegularExpressions;
Заработало) только в список добавляет не конкретное значение заданное в переменной (к примеру 406), а любое содержащее те же символы (123406). И какое бы значение в переменной "dubli" я не задавал, всегда записываются в список все найденные строчки содержащие "406" (пробовали и 1, и 500 в списке в конце всегда 198 строчек)
 
Последнее редактирование:

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 500
Благодарностей
1 263
Баллы
113
а любое содержащее те же символы (123406)
Измени регулярку которая содержится в parserPattern

Ошибся. Поправь
  1. if (sovpad.Count()>0 || sovpad.Count()>Convert.ToInt32(dubli))
 
  • Спасибо
Реакции: Karamzin

Nightgarm

Client
Регистрация
06.09.2014
Сообщения
22
Благодарностей
8
Баллы
3
Измени регулярку которая содержится в parserPattern

Ошибся. Поправь
  1. if (sovpad.Count()>0 || sovpad.Count()>Convert.ToInt32(dubli))
Регулярку в переменной задал - работает)

Замена ни к чему не привела, так же записывает все найденные повторы
Код:
406
406
406
 

Ribakov

Client
Регистрация
16.12.2015
Сообщения
47
Благодарностей
4
Баллы
8
Подскажите как подсчитать количество повторений определённой фразы (переменной) в списке?
Может кто поделится снипетом)

К примеру: надо подсчитать количество "моя фраза".
Естественно она будет в виде переменной:

Код:
моя фраза
не  моя
не моя
снова не моя
моя фраза
моя фраза
А то из того что выше я могу добиться поставленой задачи, но у меня получается 10 экшенов. А хотелось бы в один уместить.
Спасибо!
 

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 500
Благодарностей
1 263
Баллы
113
C#:
var lst = project.Lists["Список1"];
var rez = lst.Select(x=>x).Where(x=>x=="моя фраза").ToList();
lst.Clear();
lst.AddRange(rez);
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 605
Благодарностей
4 596
Баллы
113
C#:
var lst = project.Lists["Список1"];
var rez = lst.Select(x=>x).Where(x=>x=="моя фраза").ToList();
return rez.Count;
По идее так вернет количество
 

Saulius S.

Client
Регистрация
19.08.2016
Сообщения
44
Благодарностей
7
Баллы
8
Может кто подскажете как через C# сделать чтобы искал текст в списке несмотря на заглавные или маленькие буквы, на пример, в списке есть слово "Кот" а ключевик "кот"
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 039
Баллы
113
Может кто подскажете как через C# сделать чтобы искал текст в списке несмотря на заглавные или маленькие буквы, на пример, в списке есть слово "Кот" а ключевик "кот"
игнор поставь на регистр
 

Saulius S.

Client
Регистрация
19.08.2016
Сообщения
44
Благодарностей
7
Баллы
8

Saulius S.

Client
Регистрация
19.08.2016
Сообщения
44
Благодарностей
7
Баллы
8
вроде этот должен работать:
Код:
List<string> list = new List<string>();
list.AddRange(project.Lists["all"]);
string myString = project.Variables["recipient"].Value;
var matchingvalues = list
.FindAll(x => x.IndexOf(myString, StringComparison.OrdinalIgnoreCase) != -1);
return matchingvalues.First();
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 039
Баллы
113
если честно то сколько я не возился с этой строй StringComparison.OrdinalIgnoreCase в зенке то она подводит поэтому просто переведи всё в нижний регистр сначала а потом парсь и сравнивай
 

Saulius S.

Client
Регистрация
19.08.2016
Сообщения
44
Благодарностей
7
Баллы
8
У меня там список файлов, которых надо загрузить по ключевому слову
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 039
Баллы
113
наверно файл со строками
 

Saulius S.

Client
Регистрация
19.08.2016
Сообщения
44
Благодарностей
7
Баллы
8

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 039
Баллы
113
а совпадений сколько должно быть ?
 

Saulius S.

Client
Регистрация
19.08.2016
Сообщения
44
Благодарностей
7
Баллы
8
а совпадений сколько должно быть ?
По ключевому слову. Есть список файлов из которого надо по ключевому слову выбрать строки содержащие ключевик без учета регистра. Вот этот код мне ка бы и подходит, только где здесь надо поставить StringComparison.OrdinalIgnoreCase или
IgnoreCase мне понять пока сложно:
Код:
// берем переменную для полного совпадения
var parserPattern = project.Variables["key_list"].Value;
// не превращаем в регулярное выражение
// берем переменную отвечающую за нужное количество найденных дублей
var dubli = project.Variables["dubli"].Value;
// получаем список, в котором будем искать
var sourceList = project.Lists["files_list"];
// получаем список, в который будем класть
var destList = project.Lists["torrents"];
var sovpad = sourceList.Where(x => Regex.IsMatch(x, parserPattern)).ToList(); // Все совпадения пихаем в список
if (sovpad.Count()>0 || sovpad.Count()>dubli.Count())
    destList.AddRange(sovpad);
 
Последнее редактирование:

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 039
Баллы
113
скажем так. есть 10 файлов, солово мама, и из всех файлов ведернуть строки со словом мама игноря на регистр , правильно понимаю
 

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