Как ускорить код С# по поиску и удалению взаимных дублей списков перед записью?

Devostator

Client
Регистрация
17.09.2011
Сообщения
262
Благодарностей
25
Баллы
28
Подскажите пожалуйста можно ли как-то ускорить код? Выполняется довольно долго. Может изменить логику?

Коротко суть: есть 2 списка, берем строку из списка1, получаем значение до разделителя ";". Проверяем строки по этому значению в списке2, если строка есть удаляем её. Затем записываем строку списка1 целиком в список2.

В C# не очень шарю, помогал Chatgpt.

В списке1 примерно 100-1 000 строк вида: значение1;значение2;значение3;значение4;значение5..значениеN
В списке2 примерно 200 000++ строк вида: значение1;значение2;значение3;значение4;значение5..значениеN

Код:
IZennoList list2base = project.Lists["List2base"];
IZennoList list1queue = project.Lists["List1queue"];

lock (SyncObjects.ListSyncer) {
    // Логирование начала обработки
    project.SendToLog("Начало обработки списков", LogType.Info);

    // Перебираем элементы из list1queue
    foreach (var queueItem in list1queue) {
        string value1FromQueue = queueItem.Split(';')[0]; // Извлекаем значение1 из строки list1queue
        project.SendToLog($"Обработка строки из List1queue: {queueItem}", LogType.Info);

        bool foundAndRemoved = false; // Флаг для отслеживания удаления

        // Перебираем элементы из list2base для сравнения и удаления
        for (int i = 0; i < list2base.Count; i++) {
            string value1FromBase = list2base[i].Split(';')[0]; // Извлекаем значение1 из строки list2base

            // Если значение1 совпадает, удаляем строку из list2base
            if (value1FromBase == value1FromQueue) {
                project.SendToLog($"Удаление совпадающей строки из List2base: {list2base[i]}", LogType.Info);
                list2base.RemoveAt(i);
                i--; // Корректируем индекс после удаления
                foundAndRemoved = true;
            }
        }

        if (!foundAndRemoved) {
            project.SendToLog("Совпадений не найдено, строка добавляется без удаления предыдущих", LogType.Info);
        }

        // Добавляем взятую строку из list1queue в list2base
        list2base.Add(queueItem);
        project.SendToLog($"Добавлена строка в List2base: {queueItem}", LogType.Info);
    }

    // Логирование завершения обработки
    project.SendToLog("Обработка списков завершена", LogType.Info);
}
 

Devostator

Client
Регистрация
17.09.2011
Сообщения
262
Благодарностей
25
Баллы
28
Решил сам. Кому интересно - через hashset. Обработка за доли секунды десятки тысяч строк.

Переменные немного адаптированы под проект, но суть +- осталась та же.

Код_v2:
string WayToTigerDB = project.Variables["way_to_domains_database"].Value;
string WayToQueueFile = project.Variables["way_to_queue_file"].Value;
string WayToQueueFileBackup = project.Variables["way_to_queue_file_backup"].Value;

IZennoList TigerDB = project.Lists["База списком"];
IZennoList QueueFile = project.Lists["Файл-очереди на добавление"];
IZennoList QueueFileBackup = project.Lists["Файл-очереди на добавление backup"];

TigerDB.Bind(WayToTigerDB);
QueueFile.Bind(WayToQueueFile);
QueueFileBackup.Bind(WayToQueueFileBackup);

HashSet<string> uniqueValues = new HashSet<string>(QueueFile.Select(item => item.Split(';')[0]));

lock (SyncObjects.ListSyncer) {
    project.SendToLog("Начало обработки списков", LogType.Info);

    // Фильтруем TigerDB, удаляя все строки с совпадающими значениями из QueueFile
    List<string> filteredTigerDB = TigerDB.Where(item => !uniqueValues.Contains(item.Split(';')[0])).ToList();

    // Заменяем TigerDB на отфильтрованный список
    TigerDB.Clear();
    TigerDB.AddRange(filteredTigerDB);

    // Добавляем все строки из QueueFile в TigerDB и QueueFileBackup
    foreach (string queueItem in QueueFile) {
        TigerDB.Add(queueItem);
        QueueFileBackup.Add(queueItem);
    }

    project.SendToLog("Обработка списков завершена", LogType.Info);
    QueueFile.Clear();
}

Не видел на форуме реализаций через hashset. Есть какие-то минусы?
 

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 238
Благодарностей
671
Баллы
113
Решил сам. Кому интересно - через hashset. Обработка за доли секунды десятки тысяч строк.

Переменные немного адаптированы под проект, но суть +- осталась та же.

Код_v2:
string WayToTigerDB = project.Variables["way_to_domains_database"].Value;
string WayToQueueFile = project.Variables["way_to_queue_file"].Value;
string WayToQueueFileBackup = project.Variables["way_to_queue_file_backup"].Value;

IZennoList TigerDB = project.Lists["База списком"];
IZennoList QueueFile = project.Lists["Файл-очереди на добавление"];
IZennoList QueueFileBackup = project.Lists["Файл-очереди на добавление backup"];

TigerDB.Bind(WayToTigerDB);
QueueFile.Bind(WayToQueueFile);
QueueFileBackup.Bind(WayToQueueFileBackup);

HashSet<string> uniqueValues = new HashSet<string>(QueueFile.Select(item => item.Split(';')[0]));

lock (SyncObjects.ListSyncer) {
    project.SendToLog("Начало обработки списков", LogType.Info);

    // Фильтруем TigerDB, удаляя все строки с совпадающими значениями из QueueFile
    List<string> filteredTigerDB = TigerDB.Where(item => !uniqueValues.Contains(item.Split(';')[0])).ToList();

    // Заменяем TigerDB на отфильтрованный список
    TigerDB.Clear();
    TigerDB.AddRange(filteredTigerDB);

    // Добавляем все строки из QueueFile в TigerDB и QueueFileBackup
    foreach (string queueItem in QueueFile) {
        TigerDB.Add(queueItem);
        QueueFileBackup.Add(queueItem);
    }

    project.SendToLog("Обработка списков завершена", LogType.Info);
    QueueFile.Clear();
}

Не видел на форуме реализаций через hashset. Есть какие-то минусы?
Ну в приниципе хешсет тот же лист, есть мелкие отличия, да он чуть быстрее, сам дубли убирает, но в данном примере думаю что скорость достигается за счет использования LINQ
 
  • Спасибо
Реакции: Devostator

Devostator

Client
Регистрация
17.09.2011
Сообщения
262
Благодарностей
25
Баллы
28
Ну в приниципе хешсет тот же лист, есть мелкие отличия, да он чуть быстрее, сам дубли убирает, но в данном примере думаю что скорость достигается за счет использования LINQ
Спасибо не знал что такое LINQ, оказывается крутая штука!
 
  • Спасибо
Реакции: Sherminator

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