2012-03-23 5 views
11

Ok così ho due liste in C#Come faccio a ottenere la differenza in due elenchi in C#?

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

uno è di stringhe ed e uno è di un oggetto attributo che ho created..very semplice

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

ora devo confrontare a vedere quali canzoni non sono nel nome attributi così per esempio

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

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

voglio un modo per restituire "un altro" e "ancora un altro" perché non sono nella lista attributi n ame

così per pseudocodice

difference = songs - attributes.names 

risposta

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

modificare

Aggiunto ToList() per renderlo un elenco

+0

differenza sarà un elenco – Trace

+1

no, è IEnumerable, ma chiamare ToList() –

+0

An enumerabile. Usa ToList() se necessario. –

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

Questo è il modo per trovare tutte le canzoni che non sono inclusi nei nomi degli attributi:

La risposta con l'eccezione è anche perfetta e probabilmente più efficiente.

MODIFICA: questa sintassi presenta un vantaggio se la si utilizza in LINQ to SQL: si traduce in un predicato SQL NOT IN. Except non è tradotto in qualcosa in SQL. Quindi, in quel contesto, tutti i record verrebbero recuperati dal database e esclusi dal lato app, che è molto meno efficiente.

+0

Perché l'hai postato se le altre risposte che usano "Eccetto" sono perfette e più efficienti? –

+0

Se lo vedi, ho postato questo prima delle altre risposte e ho aggiunto il commento più tardi, affermando chiaramente che le altre soluzioni sono migliori. – JotaBe

+1

"Ho postato questo prima delle altre risposte." Non l'hai fatto. –

6

Vale la pena sottolineare che le risposte postato qui restituirà un elenco di songs non presenti in attributes.names, ma non vi darà un elenco di attributes.names non presenti in songs.

Mentre questo è ciò che l'OP voleva, il titolo potrebbe essere un po 'fuorviante, specialmente se (come me) siete venuti qui cercando un modo per verificare se il contenuto di due liste differisce. Se questo è ciò che si desidera, è possibile utilizzare il seguente: -

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