Самое быстрое сравнение двух списков

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 983
Благодарностей
4 433
Баллы
113
Списки довольно большие, поэтому требуется оптимизация.
Требуется сравнить список 1 со списком 2 и на выходе получить список 3 из элементов списка 1, которых нет в списке 2.
Ничего кроме как в цикле for списка 1 вызывать другой цикл for для списка 2 и сравнивать строки, я придумать не могу, но мне кажется это не оптимально.
 

nicanil

Client
Регистрация
06.03.2016
Сообщения
2 242
Благодарностей
1 820
Баллы
113
Сделал на основе вот этого ответа со StackOverflow.

C#:
var list1 = project.Lists["1"];
var list2 = project.Lists["2"];

var list3 = list1.Except(list2);

project.Lists["3"].AddRange(list3);
Перед тем как запостить сюда протестировал.
На входе: list2 - список из 100 000 строк длинной от 20 до 30 символов; list1 - строки из list2 плюс 20 000 уникальных строк, которых нет в list2. С секундомером не замерял, на глаз отработал моментально.

P.S. Перед запуском данного кода в бой, всё-равно лучше его протестировать.
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 407
Благодарностей
9 117
Баллы
113
http://zennolab.com/discussion/threads/chernyj-spisok-korrektnaja-realizacija.13705/#post-81882

Код:
List<string> bad = project.Lists["стоплист"].ToList();//стопслова
List<string> mix = project.Lists["все в куче"].ToList();//потенциальные счастливцы
var good =project.Lists["листсчастья и печенек"];//те, кото будем осчастливливать точно
List<string> kostyl = new List<string>();//важный элемент индусского кода
//блок очень сложного индусского кода
kostyl=mix.Except(bad).ToList();
foreach(string data in kostyl)
{good.Add(data);}
в стоп-списке было более ляма строк
в списке который надо обработать тоже более ляма,
обработало моментально..
 

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 983
Благодарностей
4 433
Баллы
113

Darkoman

Client
Регистрация
17.03.2018
Сообщения
54
Благодарностей
7
Баллы
8
Доброго всем дня. У меня вот такая проблема.
Суть такова что нужно сравнить два списка. В 1 списке идет две колонки во 2 списке 3. В списках содержится нименклатура,цена и номер объявления в системе.
В списке 2 (1с) постояно меняется цена.
Нужно отфильтровать изменен ия и пололжить в таблицу.

**************
Лучше конечно что бы C# обрабатывал таблицы но на форумен нашел только обработку Списков.
 

Вложения

Ikigai

Client
Регистрация
13.12.2016
Сообщения
276
Благодарностей
27
Баллы
28
Сделал на основе вот этого ответа со StackOverflow.

C#:
var list1 = project.Lists["1"];
var list2 = project.Lists["2"];

var list3 = list1.Except(list2);

project.Lists["3"].AddRange(list3);
Перед тем как запостить сюда протестировал.
На входе: list2 - список из 100 000 строк длинной от 20 до 30 символов; list1 - строки из list2 плюс 20 000 уникальных строк, которых нет в list2. С секундомером не замерял, на глаз отработал моментально.

P.S. Перед запуском данного кода в бой, всё-равно лучше его протестировать.

Отлично все работает, но возник вопрос другой вопрос.

Требуется сравнить список 1 со списком 2( по первому столбцу/параметру "x") и на выходе получить список 3 из элементов списка 1, которых нет в списке 2.

Список 1:
x1;yy1
x2;yy2
x5;yy5

Список 2:
x2;zz1
x3;zz3
x5;zz5
 
Последнее редактирование:

ErikMoor

Client
Регистрация
24.03.2016
Сообщения
123
Благодарностей
22
Баллы
18
C#:
List<string> bad = project.Lists["стоплист"].ToList();//стопслова
List<string> mix = project.Lists["все в куче"].ToList();//потенциальные счастливцы
var good =project.Lists["лист счастья и печенек"];//те, кото будем осчастливливать точно
List<string> kostyl = new List<string>();//важный элемент индусского кода
//блок очень сложного индусского кода
kostyl=mix.Except(bad).ToList();
foreach(string data in kostyl)
{good.Add(data);}
Спасибо за этот код
Код работает очень быстро
Но как сделать так что бы не влияло на регист букв и искало по типу "Содержит текст", а не только прямое вхождения, как здесь.

Пример:
Список "все в куче":
Line1
line2
liNe1
Line2

Список "стоплист":
Line1:dfgjh
line2;dfggddd


Выходной список "лист счастья и печенек":
В список попадают все из "все в куче" так как они уникальные по регистру букв
А нужно что бы этот список был пуст в данном случае так как здесь есть такое сочетание как line1 и line2

Надеюсь доступно объяснил, что есть и что нужно. Помогите пожалуйста.
 

ErikMoor

Client
Регистрация
24.03.2016
Сообщения
123
Благодарностей
22
Баллы
18
C#:
List<string> bad = project.Lists["BlackList"].ToList();//стопслова
List<string> mix = project.Lists["List_in"].ToList();//потенциальные счастливцы
var good =project.Lists["Good"];//те, кото будем осчастливливать точно
List<string> kostyl = new List<string>();//важный элемент индусского кода
//блок очень сложного индусского кода
kostyl = mix.Except(bad, StringComparer.OrdinalIgnoreCase).ToList();
foreach(string data in kostyl)
{good.Add(data);}
В данном случае кода, в список попадает:
liNe1
Line2

Нужно что бы они тоже не попали в список, так как это все тежи line1 и line2
 

ffeniks

Client
Регистрация
03.06.2016
Сообщения
312
Благодарностей
410
Баллы
63
Сделал на основе вот этого ответа со StackOverflow.

C#:
var list1 = project.Lists["1"];
var list2 = project.Lists["2"];

var list3 = list1.Except(list2);

project.Lists["3"].AddRange(list3);
Перед тем как запостить сюда протестировал.
На входе: list2 - список из 100 000 строк длинной от 20 до 30 символов; list1 - строки из list2 плюс 20 000 уникальных строк, которых нет в list2. С секундомером не замерял, на глаз отработал моментально.

P.S. Перед запуском данного кода в бой, всё-равно лучше его протестировать.
огонь
 

hukernose

Новичок
Регистрация
25.04.2023
Сообщения
1
Благодарностей
0
Баллы
1

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