2010-11-30 9 views
33

tengo una lista de escritores.Eliminar elementos de la lista de otras listas con criterios

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

También tengo dos listas de tipo Artículo.

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

lo que el código lo que tengo es:

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

Quiero eliminar aquellos registros de ArticleList, AnotherArticleList donde WriterID partidos de listWritersWriterID. ¿Cómo hacer esto en LINQ?

Respuesta

79

Si realmente has conseguido un List<T>, le sugiero que utilice List<T>.RemoveAll, después de la construcción de un conjunto de ID de escritor:

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

Si haces desee utilizar LINQ, se puede utilizar:

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

Tenga en cuenta que esto cambia la variable de pero no modifica la lista existente - por lo que si hay alguna otra referencia a la misma lista, que no va a ver ningún cambio. (Mientras que RemoveAll modifica la lista existente.)

+0

Como articlelist y anotherArticleList tienen objetos Artículo listWriters y tiene objetos escritores, esto no funcionaría a menos que el método Equals fue anulada sólo compara con la fundición WriterID correcta, ya que no parece que ella tiene una interfaz común implementado por Artículo/Escritores. – bitxwise

+0

@bitxwise: Reparar ... –

+0

Creo que es posible sin crear un HashSet de writerIds. Si echas un vistazo a mi publicación a continuación ... – bitxwise

2

Sólo un consejo de diseño, su clase debe llamarse Writer (forma singular), no Writers (plural). Cada elemento en su lista representa un solo escritor, ¿correcto?

+11

Debe poner esto en un comentario, porque no es una respuesta a la pregunta. –

+0

Gracias por señalar. Acabo de renombrarme y simplifiqué en aras de la simplicidad, pero seguía siendo un cambio de nombre incorrecto: P – developer

1

no veo realmente lo que es la dificultad que se enfrentan ...

¿Por qué no acaba de filtro/eliminar datos de usted listas usando un simple bucle for? (Tenga en cuenta que un bucle foreach definitivamente no funciona si iterar al editar/cambiar el objeto repetido)

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

El truco iteración hacia atrás resuelve el paradigma de "eliminar elementos, mientras que la iteración".

+1

El solicitante solicitó que se diera una solución utilizando LINQ ... – bitxwise

+1

Gracias por responder. En realidad, quiero una solución LINQ – developer

+2

Estoy tan contento que ya no tengo que escribir código como ese. Adiós 'C/C++' días y hola 'Linq' - OMG - Mis globos oculares están sangrando :) – ppumkin

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

Creo que esto es mejor que la respuesta aceptada. – woohoo

Cuestiones relacionadas