Сравнение двух списков

Эдгар

Client
Регистрация
20.03.2020
Сообщения
112
Благодарностей
5
Баллы
18
Мое почтение самому лучшему сообществу в мире!

Помогите с задачей, пожалуйста. Надо сравнить Список 1 и Список 2, и при совпадении из Списка 1 удалить все совпадения.

Но есть одна загвоздка: Список 1 заполнен в таком формате:

"https://r.onliner.by/ak/apartments/765491"

а Список 2 заполнен в таком формате:

"ссылка: https://r.onliner.by/ak/apartments/765491 | адрес: Боровлянский сельский Совет, Копище, улица Викентия Карповича, 1 | комнат: 3 | тел: 297042003"
 

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 238
Благодарностей
671
Баллы
113
Мое почтение самому лучшему сообществу в мире!

Помогите с задачей, пожалуйста. Надо сравнить Список 1 и Список 2, и при совпадении из Списка 1 удалить все совпадения.

Но есть одна загвоздка: Список 1 заполнен в таком формате:

"https://r.onliner.by/ak/apartments/765491"

а Список 2 заполнен в таком формате:

"ссылка: https://r.onliner.by/ak/apartments/765491 | адрес: Боровлянский сельский Совет, Копище, улица Викентия Карповича, 1 | комнат: 3 | тел: 297042003"
C#:
            var ListA = project.Lists["Список1"];
            var ListB = project.Lists["Список2"];
            List<string> ListC = new List<string>();

            foreach (var item in ListA)
            {
                foreach (var item2 in ListB)
                {
                    if (item2.Contains(item))
                    {
                        ListC.Add(item);
                    }
                }
            }
            foreach (var item in ListC)
            {
                ListA.Remove(item);
            }
            ListC.Clear();
 
  • Спасибо
Реакции: Эдгар и Juniorcpa

Эдгар

Client
Регистрация
20.03.2020
Сообщения
112
Благодарностей
5
Баллы
18
C#:
            var ListA = project.Lists["Список1"];
            var ListB = project.Lists["Список2"];
            List<string> ListC = new List<string>();

            foreach (var item in ListA)
            {
                foreach (var item2 in ListB)
                {
                    if (item2.Contains(item))
                    {
                        ListC.Add(item);
                    }
                }
            }
            foreach (var item in ListC)
            {
                ListA.Remove(item);
            }
            ListC.Clear();
Не работает...
 

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 238
Благодарностей
671
Баллы
113
  • Спасибо
Реакции: Эдгар

Эдгар

Client
Регистрация
20.03.2020
Сообщения
112
Благодарностей
5
Баллы
18

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 238
Благодарностей
671
Баллы
113
  • Спасибо
Реакции: Эдгар

Эдгар

Client
Регистрация
20.03.2020
Сообщения
112
Благодарностей
5
Баллы
18
Вот сами файлы.
 

Вложения

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 238
Благодарностей
671
Баллы
113
Последнее редактирование:
  • Спасибо
Реакции: Эдгар

Эдгар

Client
Регистрация
20.03.2020
Сообщения
112
Благодарностей
5
Баллы
18
У меня не срабатывает:(
 

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 238
Благодарностей
671
Баллы
113
У вас сработало, потому что в строке было полное совпадение, которое я указал в скобках для примера. А если это полное совпадение убрать, оставить только ссылку, тогда не срабатывает.
Я же попросил прислать строки из реального списка в котором у вас происходит ошибка, вы мне прислали, я показал что на этих списках все нормально работает. Вы говорите что нет это не то. Я вас не понимаю. То что было в скобках для примера я в список не добавлял. И удалилось то 2 строчки, а не одна. Я же скрины приложил с входными данными и что на выходе получилось. О каких скобках речь?
 
  • Спасибо
Реакции: Эдгар

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 238
Благодарностей
671
Баллы
113
У меня не срабатывает:(
А вы где смотрите содержимое первого списка после выполнения кода?
В ПМ вот сюда нажимаете?
95578


Или в TXT файле который указывали как источник входных данных?
 
  • Спасибо
Реакции: Эдгар

Эдгар

Client
Регистрация
20.03.2020
Сообщения
112
Благодарностей
5
Баллы
18

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 238
Благодарностей
671
Баллы
113
  • Спасибо
Реакции: Эдгар

Эдгар

Client
Регистрация
20.03.2020
Сообщения
112
Благодарностей
5
Баллы
18

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 238
Благодарностей
671
Баллы
113
А если вот этот код использовать, что будет в логе написано?

C#:
var ListA = project.Lists["Список1"];
 var ListB = project.Lists["Список2"];
List<string> ListC = new List<string>();
project.SendInfoToLog("Список 1 содержит " + ListA.Count.ToString() + " строк");
            foreach (var item in ListA)
            {
                foreach (var item2 in ListB)
                {
                    if (item2.Contains(item))
                    {
                        ListC.Add(item);
                    }
                }
            }
            foreach (var item in ListC)
            {
                ListA.Remove(item);                
            }
            project.SendInfoToLog("Список 1 содержит " + ListA.Count.ToString() + " строк");
            ListC.Clear();
 
  • Спасибо
Реакции: djaga и Эдгар

Эдгар

Client
Регистрация
20.03.2020
Сообщения
112
Благодарностей
5
Баллы
18
Перезагрузил проект и начало работать! Не знаю, в чем было дело... БлагоДарю!
 

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 238
Благодарностей
671
Баллы
113
  • Спасибо
Реакции: Эдгар

djaga

Administrator
Команда форума
Регистрация
26.04.2020
Сообщения
545
Благодарностей
1 124
Баллы
93
Мое почтение самому лучшему сообществу в мире!

Помогите с задачей, пожалуйста. Надо сравнить Список 1 и Список 2, и при совпадении из Списка 1 удалить все совпадения.

Но есть одна загвоздка: Список 1 заполнен в таком формате:

"https://r.onliner.by/ak/apartments/765491"

а Список 2 заполнен в таком формате:

"ссылка: https://r.onliner.by/ak/apartments/765491 | адрес: Боровлянский сельский Совет, Копище, улица Викентия Карповича, 1 | комнат: 3 | тел: 297042003"
Привет. У вас были какие-то непонятки, решил подключиться.

Набросал свой вариант, с применением регурялки, так как Contains показывает себя плохо и находит совпадения там где не нужно.
Удаление дублей из списка на основе списка с применением regexp:
List<string> targetList = project.Lists["targetList"].ToList(); // уникальный список
IZennoList links = project.Lists["links"]; // ссылки

for (int i = 0; i < links.Count; i++)
{
    string link = Regex.Replace(links[i], ".+/apartments/", "");
    foreach (var target in targetList.Where(target => Regex.IsMatch(target, $@"(?<=/apartments/){link}(?= \| )")))
    {
        links.RemoveAt(i);
        i--;
    }
}
upd: убрал лишнюю строчку.

Результат:
95585


95586


Приложил шаблон для примера ↓
 

Вложения

Последнее редактирование:

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 238
Благодарностей
671
Баллы
113
Привет. У вас были какие-то непонятки, решил подключиться.

Набросал свой вариант, с применением регурялки, так как Contains показывает себя плохо и находит совпадения там где не нужно.
Не затруднит про contains поподробнее?
 

djaga

Administrator
Команда форума
Регистрация
26.04.2020
Сообщения
545
Благодарностей
1 124
Баллы
93
Не затруднит про contains поподробнее?
Все просто, contains ищет во всей строке, и может выдать true на номер телефона (как в моём случае выше), когда как регулярке можно указать где и что искать.
Плюс по некоторым наблюдениям регулярка может быть даже быстрее contains, но это зависит от сложности операции.
Например, вот тут пишут об этом.
 
  • Спасибо
Реакции: Sho

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 238
Благодарностей
671
Баллы
113
Все просто, contains ищет во всей строке, и может выдать true на номер телефона (как в моём случае выше), когда как регулярке можно указать где и что искать.
Плюс по некоторым наблюдениям регулярка может быть даже быстрее contains, но это зависит от сложности операции.
Например, вот тут пишут об этом.
Почитал, вроде как пишут что наоборот регулярка медленнее, провел замеры времени, регулярка в 25 раз дольше работает в данном случае.
95587
 
Последнее редактирование:

djaga

Administrator
Команда форума
Регистрация
26.04.2020
Сообщения
545
Благодарностей
1 124
Баллы
93
Почитал, вроде как пишут что наоборот регулярка медленнее, провел замеры времени, регулярка в 25 раз дольше работает в данном случае.
Посмотреть вложение 95587
К чему этот флуд? "Спасибо", никто не жмет и спорим непонятно о чем.)

В моих утверждениях выше не было ни намека на то, что моё решение превосходит по скорости ваше. Я привел ссылку, где более опытные люди обсуждали это и показывают пример где регулярка быстрее.
Я конечно, согласен, что contains на короткой строке покажет себя быстрее регулярки.
Но это совершенно не важно в контексте этой задачи.

Выше приведен пример, который более безотказно выполняет операцию, так как contains ищет по всей строке и частенько сталкивался с ситуацией, когда он находит, неочевидные вещи.
В добавок новичку будет полезно увидеть несколько вариантов решения одной задачи.

Эти доли секунд будут заметны только на списках с миллионами строк, а когда речь идет о таких списках выполнение можно распараллелить и будет все ок...
 

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 238
Благодарностей
671
Баллы
113
К чему этот флуд? "Спасибо", никто не жмет и спорим непонятно о чем.)

В моих утверждениях выше не было ни намека на то, что моё решение превосходит по скорости ваше. Я привел ссылку, где более опытные люди обсуждали это и показывают пример где регулярка быстрее.
Я конечно, согласен, что contains на короткой строке покажет себя быстрее регулярки.
Но это совершенно не важно в контексте этой задачи.

Выше приведен пример, который более безотказно выполняет операцию, так как contains ищет по всей строке и частенько сталкивался с ситуацией, когда он находит, неочевидные вещи.
В добавок новичку будет полезно увидеть несколько вариантов решения одной задачи.

Эти доли секунд будут заметны только на списках с миллионами строк, а когда речь идет о таких списках выполнение можно распараллелить и будет все ок...
Не в коем случае не спорил, исключительно профессиональный интерес относительно скорости работы различных инструментов, думал вам тоже будет интересно.
 
  • Спасибо
Реакции: djaga

Эдгар

Client
Регистрация
20.03.2020
Сообщения
112
Благодарностей
5
Баллы
18
Привет. У вас были какие-то непонятки, решил подключиться.
А можно еще один вариант: удалять не копии, а удалять те строки, которые отсутствуют во втором списке? Но списки местами поменялись. Надо удалить из Списка 2 строки, которые отсутствуют в Списке 1 (ссылки).
 
Последнее редактирование:

djaga

Administrator
Команда форума
Регистрация
26.04.2020
Сообщения
545
Благодарностей
1 124
Баллы
93
А можно еще один вариант: удалять не копии, а удалять те строки, которые отсутствуют во втором списке? Но списки местами поменялись. Надо удалить из Списка 2 строки, которые отсутствуют в Списке 1 (ссылки).
Можно вот так:
Сбор уникальных ссылок на основе двух списков с применением regexp:
List<string> targetList = project.Lists["targetList"].ToList();
List<string> links = project.Lists["links"].ToList();
List<string> tempList = new List<string>();

foreach (var l in links)
{
    string link = Regex.Replace(l, ".+/apartments/", "");
    tempList.AddRange(from target in targetList where Regex.IsMatch(target, $@"(?<=/apartments/){link}(?= \| )") select l);
}
project.Lists["links"].Clear();
project.Lists["links"].AddRange(tempList);
Результат:
95605


Приложил для примера шаблон ↓
 

Вложения

  • Спасибо
Реакции: Astraport

Эдгар

Client
Регистрация
20.03.2020
Сообщения
112
Благодарностей
5
Баллы
18
Можно вот так:
Сбор уникальных ссылок на основе двух списков с применением regexp:
List<string> targetList = project.Lists["targetList"].ToList();
List<string> links = project.Lists["links"].ToList();
List<string> tempList = new List<string>();

foreach (var l in links)
{
    string link = Regex.Replace(l, ".+/apartments/", "");
    tempList.AddRange(from target in targetList where Regex.IsMatch(target, $@"(?<=/apartments/){link}(?= \| )") select l);
}
project.Lists["links"].Clear();
project.Lists["links"].AddRange(tempList);
Результат:
Посмотреть вложение 95605

Приложил для примера шаблон ↓
Увы, не срабатывает... Не удаляет из "targetList" строки, которые отсутствуют в "links".
 

djaga

Administrator
Команда форума
Регистрация
26.04.2020
Сообщения
545
Благодарностей
1 124
Баллы
93
Увы, не срабатывает... Не удаляет из "targetList" строки, которые отсутствуют в "links".
Ух ну и запутали вы.)
Я думаю больше вариантов не осталось. :ah:

Сбор уникальных строк на основе списка ссылок с применением regexp LINQ:
List<string> targetList = project.Lists["targetList"].ToList();
List<string> links = project.Lists["links"].ToList();
List<string> tempList = new List<string>();

foreach (var t in targetList)
    tempList.AddRange(from link in links
                      select Regex.Replace(link, ".+/apartments/", "")
                      into l
                      where Regex.IsMatch(t, $@"(?<=/apartments/){l}(?= \| )")
                      select t);
project.Lists["targetList"].Clear();
project.Lists["targetList"].AddRange(tempList);
Сбор уникальных строк на основе списка ссылок с применением regexp:
List<string> targetList = project.Lists["targetList"].ToList();
List<string> links = project.Lists["links"].ToList();
List<string> tempList = new List<string>();


for (var i = 0; i < targetList.Count; i++)
{
    foreach (string link in links)
    {
        string l = Regex.Replace(link, ".+/apartments/", "");
        if (!Regex.IsMatch(targetList[i], $@"(?<=/apartments/){l}(?= \| )")) continue;
        tempList.Add(targetList[i]);
    }
}
project.Lists["targetList"].Clear();
project.Lists["targetList"].AddRange(tempList);
Результат:
95614


Ниже приложил шаблон для теста.
 

Вложения

Эдгар

Client
Регистрация
20.03.2020
Сообщения
112
Благодарностей
5
Баллы
18
Ух ну и запутали вы.)
Я думаю больше вариантов не осталось. :ah:

Сбор уникальных строк на основе списка ссылок с применением regexp LINQ:
List<string> targetList = project.Lists["targetList"].ToList();
List<string> links = project.Lists["links"].ToList();
List<string> tempList = new List<string>();

foreach (var t in targetList)
    tempList.AddRange(from link in links
                      select Regex.Replace(link, ".+/apartments/", "")
                      into l
                      where Regex.IsMatch(t, $@"(?<=/apartments/){l}(?= \| )")
                      select t);
project.Lists["targetList"].Clear();
project.Lists["targetList"].AddRange(tempList);
Сбор уникальных строк на основе списка ссылок с применением regexp:
List<string> targetList = project.Lists["targetList"].ToList();
List<string> links = project.Lists["links"].ToList();
List<string> tempList = new List<string>();


for (var i = 0; i < targetList.Count; i++)
{
    foreach (string link in links)
    {
        string l = Regex.Replace(link, ".+/apartments/", "");
        if (!Regex.IsMatch(targetList[i], $@"(?<=/apartments/){l}(?= \| )")) continue;
        tempList.Add(targetList[i]);
    }
}
project.Lists["targetList"].Clear();
project.Lists["targetList"].AddRange(tempList);
Результат:
Посмотреть вложение 95614

Ниже приложил шаблон для теста.
БлагоДарю! Сейчас работает!
 
  • Спасибо
Реакции: djaga
Регистрация
26.05.2020
Сообщения
495
Благодарностей
172
Баллы
43
@djaga, а можно вас призвать в эту тему? Вот прям чувствую, вы сможете помочь... :ah:
 
  • Спасибо
Реакции: djaga

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