Подтвердить что ты не робот

Удалить элементы списка из других списков с критериями

У меня есть список авторов.

public class Writers{   
    long WriterID { get;set; }
}

Также у меня есть два списка типа Article.

public class Article{
    long ArticleID { get; set; }
    long WriterID { get; set; }
    //and others    
}

так что код я есть:

List<Article> ArticleList = GetList(1);
List<Article> AnotherArticleList = AnotherList(2);
List<Writers> listWriters = GetAllForbiddenWriters();

Я хочу удалить эти записи из ArticleList, AnotherArticleList, где WriterID соответствует listWriters WriterID. Как это сделать в LINQ?

4b9b3361

Ответ 1

Если вы действительно получили List<T>, я предлагаю вам использовать List<T>.RemoveAll после создания набора идентификаторов записи:

HashSet<long> writerIds = new HashSet<long>(listWriters.Select(x => x.WriterID));

articleList.RemoveAll(x => writerIds.Contains(x.WriterId));
anotherArticleList.RemoveAll(x => writerIds.Contains(x.WriterId));

Если вы хотите использовать LINQ, вы можете использовать:

articleList = articleList.Where(x => !writerIds.Contains(x.WriterId))
                         .ToList();
anotherArticleList = anotherArticleList
                         .Where(x => !writerIds.Contains(x.WriterId))
                         .ToList();

Обратите внимание, что это изменяет переменную, но не изменяет существующий список - поэтому, если есть какие-либо другие ссылки на один и тот же список, они не будут видеть никаких изменений. (В то время как RemoveAll изменяет существующий список.)

Ответ 2

articlesList.RemoveAll(a => listWriters.Exists(w => w.WriterID == a.WriterID));
anotherArticlesList.RemoveAll(a => listWriters.Exists(w => w.WriterID == a.WriterID));

Ответ 3

Как раз совет дизайна, ваш класс должен называться Writer (единственная форма), а не Writers (множественное число). Каждый элемент в вашем списке представляет собой один писатель, правильно?

Ответ 4

Я действительно не понимаю, в чем заключается трудность, с которой вы сталкиваетесь...

Почему бы вам просто не фильтровать/удалять данные из списков, используя простой цикл? (Обратите внимание, что цикл foreach Loop определенно НЕ работает, если вы выполняете итерацию при редактировании/изменении итерационного объекта)

for (int i = ArticleList.Count -1; i >= 0; i--)
{
    for (int j = 0; j < listWriters.Count; j++)
    {
        if (ArticleList[i].WriterId == listWriters[j].WriterID )
            ArticleList.RemoveAt(i);
    }            
}

Трейк обратной итерации решает парадигму "удалить элементы во время итерации".

Ответ 5

Вы можете использовать кроме:

List<car> list1 = GetTheList();
List<car> list2 = GetSomeOtherList();
List<car> result = list2.Except(list1).ToList();