Поиск одинаковых строк по регулярке в списке и удаление их. C#

irving zisman

Client
Регистрация
18.05.2017
Сообщения
224
Благодарностей
28
Баллы
28
Помогите накатать сниппет, нехватет знаний как его правильно написать. Сама суть:

Есть список в котором хранятся строки типа:

Вася. вышел в магазин
Петя. сел поесть
Саша. вынес мусор
Петя. любит кошек

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

Вася. вышел в магазин
Саша. вынес мусор

или

Вася. вышел в магазин
Петя. сел поесть
Саша. вынес мусор

Оба вариант подходят, т.е можно удалить все дубли или 1 строку оставить
 
Последнее редактирование:

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
547
Баллы
93
C#:
string name = "Вася";

List<string> lst = new List<string>();
lst.AddRange(new string[]{"Вася. вышел в магазин","Петя. сел поесть","Саша. вынес мусор","Петя. любит кошек"});

for (int i = 0; i < lst.Count(); i++) if (lst[i].ToLower().Contains(name.ToLower())) lst.RemoveAt(i);
 
  • Спасибо
Реакции: Sho

irving zisman

Client
Регистрация
18.05.2017
Сообщения
224
Благодарностей
28
Баллы
28
C#:
string name = "Вася";

List<string> lst = new List<string>();
lst.AddRange(new string[]{"Вася. вышел в магазин","Петя. сел поесть","Саша. вынес мусор","Петя. любит кошек"});

for (int i = 0; i < lst.Count(); i++) if (lst[i].ToLower().Contains(name.ToLower())) lst.RemoveAt(i);
Спасибо! Но это не то. В списке может быть тысячи строк, разного содержания, но каждая строка всегда начинается с какого-либо слова, затем точка и далее текст. Нужно в цикл все записывать, типа берем первую строку, парсим все до точки, ищем есть ли совпадения по всему списку, если есть удаляем строку в которой было совпадение, если нет берем вторую строку и проделываем все тоже самое и так пока не закончатся все строки
 

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
547
Баллы
93
Спасибо! Но это не то. В списке может быть тысячи строк, разного содержания, но каждая строка всегда начинается с какого-либо слова, затем точка и далее текст. Нужно в цикл все записывать, типа берем первую строку, парсим все до точки, ищем есть ли совпадения по всему списку, если есть удаляем строку в которой было совпадение, если нет берем вторую строку и проделываем все тоже самое и так пока не закончатся все строки
C#:
List<string> lst = new List<string>();
lst.AddRange(new string[]{"Вася. вышел в магазин","Петя. сел поесть","Саша. вынес мусор","Петя. любит кошек"});

List<string> names = new List<string>();
names.AddRange(new string[]{"Вася", "Саша"});

names.ForEach(n => {
    for (int i = 0; i < lst.Count(); i++)
        if (Regex.Match(lst[i], @".*(?=\.)").Value.Trim().ToLower().Contains(n.ToLower())) lst.RemoveAt(i);
});
 

irving zisman

Client
Регистрация
18.05.2017
Сообщения
224
Благодарностей
28
Баллы
28
Спасибо @Dimionix

C#:
IZennoList list = project.Lists["List"];

lock (SyncObjects.ListSyncer) {
    for (int i = 0; i < list.Count; i++) {
        for (int j = i + 1; j < list.Count; j++) {
            if (list[i].Split('.')[0] == list[j].Split('.')[0]) {
                list.RemoveAt(j); j--;
            }
        }
    }
}
 

webvik

Client
Регистрация
18.07.2019
Сообщения
2
Благодарностей
1
Баллы
3
Похожая задача есть, нужно удалить из списка дубли строк в которых часть текста совпадает.
Эта часть всегда находится между ";;;" и "|"

Пример списка:

/all/?tag=perepis-naseleniya;;;/turizm/|
/all/?tag=vk-dinamo;;;/turizm/|
/all/?tag=proverki&PAGEN_1=6;;;/turizm/|
/all/?tag=sochi;;;/local/templates/.default/css/jquery.fancybox.min.css|
/all/?tag=pozharnye&PAGEN_1=3;;;/turizm/|



После удаления должно получиться так:
/all/?tag=perepis-naseleniya;;;/turizm/|
/all/?tag=sochi;;;/local/templates/.default/css/jquery.fancybox.min.css|

Кто знает, подскажите плиз)
 

djaga

Client
Регистрация
26.04.2020
Сообщения
505
Благодарностей
1 050
Баллы
93
Похожая задача есть, нужно удалить из списка дубли строк в которых часть текста совпадает.
Эта часть всегда находится между ";;;" и "|"

Пример списка:

/all/?tag=perepis-naseleniya;;;/turizm/|
/all/?tag=vk-dinamo;;;/turizm/|
/all/?tag=proverki&PAGEN_1=6;;;/turizm/|
/all/?tag=sochi;;;/local/templates/.default/css/jquery.fancybox.min.css|
/all/?tag=pozharnye&PAGEN_1=3;;;/turizm/|

После удаления должно получиться так:
/all/?tag=perepis-naseleniya;;;/turizm/|
/all/?tag=sochi;;;/local/templates/.default/css/jquery.fancybox.min.css|

Кто знает, подскажите плиз)
Можно вот так:
Поиск дублей с помощью regexp:
List<string> list = project.Lists["lines"].ToList(); // переименовать список в "lines" или наоборот
List<string> temp = new List<string>();

for (var i = 0; i < list.Count; i++)
{
    string s = Regex.Matches(list[i], "(?<=;;;).+(?=\\|)")[0].Value;
    if (!temp.Exists(str => s == Regex.Matches(str, "(?<=;;;).+(?=\\|)")[0].Value))
    {
        temp.Add(list[i]);
    }
}

project.Lists["lines"].Clear();
project.Lists["lines"].AddRange(temp);
Шаблон ниже ↓
 

Вложения

webvik

Client
Регистрация
18.07.2019
Сообщения
2
Благодарностей
1
Баллы
3
Можно вот так:
Поиск дублей с помощью regexp:
List<string> list = project.Lists["lines"].ToList(); // переименовать список в "lines" или наоборот
List<string> temp = new List<string>();

for (var i = 0; i < list.Count; i++)
{
    string s = Regex.Matches(list[i], "(?<=;;;).+(?=\\|)")[0].Value;
    if (!temp.Exists(str => s == Regex.Matches(str, "(?<=;;;).+(?=\\|)")[0].Value))
    {
        temp.Add(list[i]);
    }
}

project.Lists["lines"].Clear();
project.Lists["lines"].AddRange(temp);
Шаблон ниже ↓
Спасибо большое!))
 
  • Спасибо
Реакции: djaga

malysh

Client
Регистрация
27.07.2017
Сообщения
420
Благодарностей
55
Баллы
28
Можно вот так:
Поиск дублей с помощью regexp:
List<string> list = project.Lists["lines"].ToList(); // переименовать список в "lines" или наоборот
List<string> temp = new List<string>();

for (var i = 0; i < list.Count; i++)
{
    string s = Regex.Matches(list[i], "(?<=;;;).+(?=\\|)")[0].Value;
    if (!temp.Exists(str => s == Regex.Matches(str, "(?<=;;;).+(?=\\|)")[0].Value))
    {
        temp.Add(list[i]);
    }
}

project.Lists["lines"].Clear();
project.Lists["lines"].AddRange(temp);
Шаблон ниже ↓
привет, а если нужно удалить не только дубли, но и те строки с которыми дубли совпадали??
 

djaga

Client
Регистрация
26.04.2020
Сообщения
505
Благодарностей
1 050
Баллы
93
привет, а если нужно удалить не только дубли, но и те строки с которыми дубли совпадали??
Окей. :cc:
Можно и так сделать ↓

Поиск и полное удаление дублей в списке с помощью regexp:
List<string> list = project.Lists["lines"].ToList(); // переименовать список в "lines" или наоборот
List<string> temp = new List<string>();

foreach (string s in list)
{
    int count = 0;
    string piece = Regex.Matches(s, "(?<=;;;).+(?=\\|)")[0].Value;
    foreach (string s1 in list
                       .Where(s1 => Regex.IsMatch(s1, $"(?<=;;;){piece}(?=\\|)"))
                       .Where(s1 => ++count > 1)) { break; }
    if (count == 1) temp.Add(s);
}

project.Lists["lines"].Clear();
project.Lists["lines"].AddRange(temp);
Если будут ещё вопросы, в подписи есть информация как мне написать.

Шаблон приложил ниже
 

Вложения

malysh

Client
Регистрация
27.07.2017
Сообщения
420
Благодарностей
55
Баллы
28
Окей. :cc:
Можно и так сделать ↓

Поиск и полное удаление дублей в списке с помощью regexp:
List<string> list = project.Lists["lines"].ToList(); // переименовать список в "lines" или наоборот
List<string> temp = new List<string>();

foreach (string s in list)
{
    int count = 0;
    string piece = Regex.Matches(s, "(?<=;;;).+(?=\\|)")[0].Value;
    foreach (string s1 in list
                       .Where(s1 => Regex.IsMatch(s1, $"(?<=;;;){piece}(?=\\|)"))
                       .Where(s1 => ++count > 1)) { break; }
    if (count == 1) temp.Add(s);
}

project.Lists["lines"].Clear();
project.Lists["lines"].AddRange(temp);
Если будут ещё вопросы, в подписи есть информация как мне написать.

Шаблон приложил ниже
шикарно, спасибо)
 
  • Спасибо
Реакции: djaga

djaga

Client
Регистрация
26.04.2020
Сообщения
505
Благодарностей
1 050
Баллы
93

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