вычитание списков

wizard

Client
Регистрация
04.10.2011
Сообщения
1 004
Благодарностей
632
Баллы
113
Здравствуйте, подскажите что я делаю не так,
Задача: из одного списка (fd) удалить все записи которые встречаются в списке (fd_user)
Код:
var fd_user = project.Lists["fd_user"];
fd_user.Bind( project.Directory + "\\fd_user\\"+project.Variables["bot_login"].Value+".txt"); // Связываем список с файлом

//--------------
var fd = project.Lists["fd"];


for(int i=0; i < fd.Count; i++)
    {
        // читаем строку из списка
        var str = fd[i];
   
        for(int j=0; j < fd_user.Count; j++)
        {
        var str2 = fd_user[j];
        if (string.Compare(str, str2, true)==0) {
            fd.RemoveAt(i);
            break; }
      
 
         }
 
    }
код почему то не удаляет все элементы с первого раза ) нужно прогнать 5-6 раз ....
 
Последнее редактирование:

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Здравствуйте, подскажите что я делаю не так,
Задача: из одного списка (fd) удалить все записи которые встречаются в списке (fd_user)
Код:
var fd_user = project.Lists["fd_user"];
fd_user.Bind( project.Directory + "\\fd_user\\"+project.Variables["bot_login"].Value+".txt"); // Связываем список с файлом

//--------------
var fd = project.Lists["fd"];


for(int i=0; i < fd.Count; i++)
    {
        // читаем строку из списка
        var str = fd[I];
   
        for(int j=0; j < fd_user.Count; j++)
        {
        var str2 = fd_user[j];
        if (string.Compare(str, str2, true)==0) {
            fd.RemoveAt(i);
            break; }
      
 
         }
 
    }
код почему то не удаляет все элементы с первого раза ) нужно прогнать 5-6 раз ....
потому, что ты удаляешь, например, 10ю запись. и на место неё становится другая запись, которая тоже становится десятой. Но десятую запись ты уже не проверяшь, ибо цикл пошёл по новой и i=11
 

wizard

Client
Регистрация
04.10.2011
Сообщения
1 004
Благодарностей
632
Баллы
113
Код:
 ..... for(int i=0; i < fd.Count; i++)
    {
        // читаем строку из списка
        var str = fd[i];

        for(int j=0; j < fd_user.Count; j++)
        {
        var str2 = fd_user[j];
        if (string.Compare(str, str2, true)==0) {
            fd.RemoveAt(i);
      i--; // <-------- так что ли? ))
            break; }
  
         }
    }
как то не комильфо - но работает
 

7make

Client
Регистрация
25.06.2011
Сообщения
1 547
Благодарностей
1 311
Баллы
113

Обращаем Ваше внимание на то, что данный пользователь заблокирован.
Не рекомендуем проводить с 7make какие-либо сделки.

wizard

Client
Регистрация
04.10.2011
Сообщения
1 004
Благодарностей
632
Баллы
113

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Код:
 ..... for(int i=0; i < fd.Count; i++)
    {
        // читаем строку из списка
        var str = fd[i];

        for(int j=0; j < fd_user.Count; j++)
        {
        var str2 = fd_user[j];
        if (string.Compare(str, str2, true)==0) {
            fd.RemoveAt(i);
      i--; // <-------- так что ли? ))
            break; }
 
         }
    }
как то не комильфо - но работает
да, я об этом
 

7make

Client
Регистрация
25.06.2011
Сообщения
1 547
Благодарностей
1 311
Баллы
113

Обращаем Ваше внимание на то, что данный пользователь заблокирован.
Не рекомендуем проводить с 7make какие-либо сделки.

чет сложно как то ... наверно неразберусь
Все "как и с листами")
Разница в 1 слове (List<T> => HashSet<T>) и наборе готовых методов для таких задач.
+ Плюшка в быстром выполнении)
HashSet<T> => O(1)
List <T> => O(n)


C#:
var listA = new List<string>(){ "a", "b", "c", "d", "e", "f", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
var listB = new List<string>() {"a", "b", "c", "d", "e", "f"};

var hashSetA = new HashSet<string>(listA);
var hashSetB = new HashSet<string>(listB);

//Пересечение. Общие элементы для обоих множеств
// {"a", "b", "c", "d", "e", "f"}
hashSetA.IntersectWith(hashSetB);       

//Вычитание
//{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}
hashSetA.ExceptWith(hashSetB);
 
Последнее редактирование:
  • Спасибо
Реакции: Rudan и doc

Rudan

Client
Регистрация
21.10.2014
Сообщения
29
Благодарностей
3
Баллы
3
Все "как и с листами")
Разница в 1 слове (List<T> => HashSet<T>) и наборе готовых методов для таких задач.
+ Плюшка в быстром выполнении)
HashSet<T> => O(1)
List <T> => O(n)


C#:
var listA = new List<string>(){ "a", "b", "c", "d", "e", "f", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
var listB = new List<string>() {"a", "b", "c", "d", "e", "f"};

var hashSetA = new HashSet<string>(listA);
var hashSetB = new HashSet<string>(listB);

//Пересечение. Общие элементы для обоих множеств
// {"a", "b", "c", "d", "e", "f"}
hashSetA.IntersectWith(hashSetB);      

//Вычитание
//{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}
hashSetA.ExceptWith(hashSetB);
А как потом сохранить результат в список?
 

bizzon

Client
Регистрация
08.09.2015
Сообщения
1 103
Благодарностей
132
Баллы
63
Последнее редактирование:

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
Как завести списки из кубиков и сохранить результат в список?
вместо строки 2,3 напиши зеновские списки

добавляем в список
C#:
var list = project.Lists["testList"];
list.AddRange(hashSetA);
 
  • Спасибо
Реакции: bizzon

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