2010-11-30 4 views
33

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

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

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

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 результаты от listWritersWriterID. Как это сделать в LINQ?

ответ

79

Если вы на самом деле есть 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 изменяет существующий список.)

+0

Как articleList и anotherArticleList есть статья объектов и listWriters имеет Писатели объекты, это не будет работать, если метод Equals не был преодолен только сравнить WriterID с правильной отливкой, так как она не выглядит, как будто она имеет общий интерфейс, реализованный по статье/писателям. – bitxwise 2010-11-30 10:15:56

+0

@bitxwise: Fixing ... – 2010-11-30 10:20:41

+0

Я думаю, что это возможно без создания HashSet writerIds. Если вы посмотрите на мой пост ниже ... – bitxwise 2010-11-30 10:25:42

2

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

1

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

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

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); 
    }    
} 

отсталая итерация трюк решает «удалять элементы в то время как итерацию» парадигму.

30
articlesList.RemoveAll(a => listWriters.Exists(w => w.WriterID == a.WriterID)); 
anotherArticlesList.RemoveAll(a => listWriters.Exists(w => w.WriterID == a.WriterID)); 
Смежные вопросы