2012-07-09 197 views
6

Tengo dos listas genéricas, una llamada "Destacado" y la otra llamada "Filtrada".Comparar dos listas genéricas y eliminar duplicados

List<Content> Featured = new List<Content>(); 
List<Content> Filtered = new List<Content>(); 

Ambos contienen elementos "contenido", que son clases simples de este modo:

public class Content 
{ 
    public long ContentID { get; set;} 
    public string Title { get; set; } 
    public string Url { get; set; } 
    public string Image { get; set; } 
    public string Teaser { get; set; } 

    public Content(long contentId, string title, string url, string image, string teaser) 
    { 
     ContentID = contentId; 
     Title = title; 
     Url = url; 
     Image = image; 
    } 
} 

Los elementos que aparecen en el "filtrado", pero también aparecen en "destacados" necesidad de ser eliminado de "filtrado" . Además, ambas listas se combinarán en una sola lista genérica con los elementos "destacados" que aparecen primero.

Sé que podría escribir un par de bucles foreach para hacer esto, pero no puedo evitar sentir que debe haber un método más elegante usando LINQ.

Estoy usando C# 4.0.

+0

Por lo tanto, 'Featured 'debe aparecer en su totalidad, y luego' Filtered', pero ¿se ha eliminado algún elemento de 'Featured'? –

+0

Sí, eso es correcto :) –

+1

Eche un vistazo a: http://stackoverflow.com/a/2060093/100283. No es Linq, pero es una manera fácil de comparar los dos objetos. –

Respuesta

6

Si tiene un IEqualityComparer definido puede utilizar el Union método:

List<Content> FeaturedAndFiltered = Featured.Union(Filtered, new MyContentComparer()); 

Una aplicación aproximada de MyContentComparer sería:

public class ContentEqualityComparer : IEqualityComparer<Content> 
{ 

    public bool Equals(Content c1, Content c2) 
    { 
     return (c1.ContentID == c2.ContentID); 
    } 


    public int GetHashCode(Content c) 
    { 
     return c.ContentID.GetHashCode(); 
    } 

} 
2

Suponiendo que los objetos Presentador en ambas listas son los mismos real objetos, puede hacer lo siguiente:

var totalList = Featured 
    .Concat(Filtered.Where(f => !Featured.Contains(f))) 
    .ToList() 

actualización

O, utilizando el método Excepto como se ha mencionado por Mahmoud Gamal:

var totalList = Featured 
    .Concat(Filtered.Except(Featured)) 
    .ToList() 
6

Usted está buscando el método de LINQ Union, específicamente

var singleList = Featured.Union(Filtered); 

Esto devolverá todo el Featured artículos, seguidos por todos los artículos Filtered que no fueron Featured. Tenga en cuenta que se también eliminar los duplicados dentro de una lista - de modo que si un artículo es Featured dos veces, que sólo aparece una vez .

Usted, sin embargo, tienen que ser capaces de comparar casos de Content con el fin de hacer esto, ya sea mediante la adición en las implementaciones de Equal y GetHashCode o proporcionando un IEqualityComparer.

Cuestiones relacionadas