2012-03-23 9 views
11

Ok, así que tienen dos listas en C#¿Cómo obtengo la diferencia en dos listas en C#?

List<Attribute> attributes = new List<Attribute>(); 
List<string> songs = new List<string>(); 

uno es de cadenas y y uno es un objeto de atributo que i created..very sencilla

class Attribute 
{ 
    public string size { get; set; } 
    public string link { get; set; } 
    public string name { get; set; } 
    public Attribute(){} 
    public Attribute(string s, string l, string n) 
    { 
     size = s; 
     link = l; 
     name = n; 
    } 
} 

ahora tengo que comparar para ver qué canciones no están en el nombre de atributos así por ejemplo

songs.Add("something"); 
songs.Add("another"); 
songs.Add("yet another"); 

Attribute a = new Attribute("500", "http://google.com", "something"); 
attributes.Add(a); 

quiero una manera de volver "otro" y "otro" porque no están en la lista de atributos n AME

así que para pseudocódigo

difference = songs - attributes.names 

Respuesta

33
var difference = songs.Except(attributes.Select(s=>s.name)).ToList(); 

edición

Agregado ToList() para que sea una lista

+0

diferencia será una lista – Trace

+1

no, es IEnumerable, pero llamar ToList() –

+0

Un enumerable. Use ToList() si lo necesita. –

4
var diff = songs.Except(attributes.Select(a => a.name)).ToList(); 
4

Ésta es la manera de encontrar todas las canciones que no están incluidos en los nombres de los atributos:

var result = songs 
    .Where(!attributes.Select(a => a.name).ToList().Contains(song)); 

La respuesta usando Except también es perfecta y probablemente más eficiente.

EDITAR: Este sintax tiene una ventaja si lo está utilizando en LINQ to SQL: se traduce en un predicado de SQL NOT IN. Except no está traducido a nada en SQL. Entonces, en ese contexto, todos los registros se recuperarían de la base de datos y se exceptuarían del lado de la aplicación, que es mucho menos eficiente.

+0

¿Por qué publicaste esto si las otras respuestas que usan 'Except' son perfectas y más eficientes? –

+0

Si lo ve, publiqué esto antes de las otras respuestas, y agregué el comentario más tarde, indicando claramente que las otras soluciones son mejores. – JotaBe

+1

"Publiqué esto antes de las otras respuestas". No lo hiciste –

6

Vale la pena señalar que las respuestas incluidas en este documento se devolverá una lista de songs no está presente en attributes.names, pero no le dará una lista de attributes.names no está presente en songs.

Si bien esto es lo que OP quería, el título puede ser un poco engañoso, especialmente si (como yo) viniste aquí en busca de una forma de comprobar si el contenido de dos listas difiere. Si esto es lo que desea, puede utilizar el siguiente: -

var differences = new HashSet(songs); 
differences.SymmetricExceptWith(attributes.Select(a => a.name)); 
if (differences.Any()) 
{ 
    // The lists differ. 
} 
Cuestiones relacionadas