2009-10-27 12 views
14

Questo dovrebbe essere facile.LINQ: Controlla se Due liste sono uguali

Voglio controllare se due liste sono uguali in quanto contengono tutti gli stessi elementi o meno, ordini non importanti.

elementi duplicati sono considerati uguali, IEE, new[]{1,2,2} è lo stesso con new[]{2,1}

+0

@ 280Z28: quindi hai votato una domanda a causa delle risposte? Non sembra molto ragionevole. – Graviton

+0

@Ngu, grazie per il chiarimento. –

+1

Il SetEquals di HashSet è più adatto per verificare se due set sono uguali come definito in questa domanda – Lijo

risposta

28
var same = list1.Except(list2).Count() == 0 && 
      list2.Except(list1).Count() == 0; 
+2

bene lì, ho dimenticato il secondo bit, non c'è bisogno di downvote ... – leppie

+1

Che cosa è un duplicato diverso? – leppie

+11

Una versione ancora più "linq-ish": '! Lista1.Except (lista2) .Any() &&! List2.Except (lista1).Any() ' – TLS

1

È necessario ottenere l'intersezione delle due liste: domanda

bool areIntersected = t1.Intersect(t2).Count() > 0; 

In risposta alla prenotazione Sei modificato:

bool areSameIntersection = t1.Except(t2).Count() == 0 && t2.Except(t1).Count() == 0; 
+0

Penso che la mia domanda non sia formulata chiaramente ... Ho modificato la domanda – Graviton

+0

Se 't1' è {1, 2, 2 } e 't2' è {1, 2, 2}, ciò restituirà erroneamente false. –

0

Se il conteggio di elementi lista1 in elenco2 è uguale al conteggio di elementi lista2 in elenco1, le liste contengono entrambi lo stesso n umber di elementi, sono entrambi sottoinsiemi - in altre parole, entrambi contengono gli stessi elementi.

if (list1.Count(l => list2.Contains(l)) == list2.Count(l => list1.Contains(l))) 
    return true; 
else 
    return false; 
6

Edit: Questo è stato scritto prima che il PO ha aggiunto che {1, 2, 2} è uguale a {1, 1, 2} (per quanto riguarda la gestione delle voci duplicate).

Questo funzionerà finché gli elementi sono comparabili per l'ordine.

bool equal = list1.OrderBy(x => x).SequenceEqual(list2.OrderBy(x => x)); 
+1

Questo non aiuta con i duplicati. – leppie

+0

@leppie: cosa intendi? Se 'list1' contiene 4' 3', quindi 'equal' sarebbe vero solo se' list2' contenesse esattamente 4 '3'. I duplicati funzionano bene. –

+0

È possibile eliminare le chiamate OrderBy se l'ordine della sequenza sarà lo stesso; come quando si confrontano gli elenchi di eventi dai test. – Jason

3

La SetEquals di HashSet è più adatto per verificando se due insiemi sono uguali come definito in questa domanda

 string stringA = "1,2,2"; 
     string stringB = "2,1"; 

     HashSet<string> setA = new HashSet<string>((stringA.Trim()).Split(',').Select(t => t.Trim())); 
     HashSet<string> setB = new HashSet<string>((stringB.Trim()).Split(',').Select(t => t.Trim())); 

     bool isSetsEqual = setA.SetEquals(setB); 

RIFERIMENTO:

  1. Check whether two comma separated strings are equal (for Content set)
+2

Usare HashSets sembra il modo più elegante per farlo (e probabilmente anche molto veloce). – ThisGuy

Problemi correlati