2010-06-01 12 views
7

Ho due elenchi di interi (List<int>). Essi contengono gli stessi elementi, ma Lista 1 contiene elementi che non sono nella lista 2.Trova elementi "non uguali" in due array

Come per trovare quale elementi della lista 1 non sono nella lista 2.

Grazie :)

PS. lang is C#

risposta

3
new HashSet<int>(l1).ExceptWith(l2); 
-1

Se non sono ordinati o qualcosa del genere, si avrà un momento difficile.

O algoritmo O (N^2) (un semplice, stupido ciclo) o strutture dati aggiuntive, dimmi quale preferisci.

Oppure, è possibile ovviamente modificare i dati di origine mediante l'ordinamento, che suppongo non sia un'opzione.

+1

In che modo è possibile ordinarli entrambi in O (N log N) non è una possibilità? – Pieter

+0

Bene, potresti radixare-ordinare entrambi gli elenchi O (kN) e calcolare la differenza O (N). – kennytm

18

È possibile utilizzare IEnumerable.Except:

list1.Except(list2); 
+0

+1. Mi hai battuto su di esso. – brickner

+0

non può fare in questo modo perché l'argomento di Except deve essere IEnumerable. L'elenco come argomento non è accettabile. – trnTash

+3

@trnTash: Elenco implementazioni IEnumerable . Il codice è corretto – dtb

0

Per semplicità si può utilizzare il metodo Contiene e verificare la presenza di una lista che non contiene un elemento dell'altro:

for (int i = 0; i < list2.Count; ++i) 
{ 
    if (!list1.Contains(list2[i]) //current element is not in list 1 
     //some code 
} 
+0

Questo è indietro e un algoritmo O (N^2). –

+0

questo potrebbe fare anche ma l'altra soluzione è molto più veloce e meno codice – trnTash

1

Una molto facile soluzione:

HashSet<int> theSet1 = new HashSet<int>(List1); 
theSet1.ExceptWith(List2); 
+0

HashSet ha aiutato dopo tutto. Grazie! – trnTash

+5

Ti stai ringraziando per la tua risposta? –

+2

No. Al tizio che ha cancellato il suo post. – trnTash

0

Se la soluzione è quella lista abeti contengono secondo e per voi la caccia record onli aggiunti dopo la prima lista, Forse questo sta per essere utile

public static int DokleSuIsti(IList<string> prevzemNow, IList<string> prevzemOld) 
     { 
      int dobroja = 0; 
      int kolikohinaje; 
      if (prevzemOld.Count() < prevzemNow.Count()) 
      { 
       kolikohinaje = prevzemOld.Count(); 
      } 
      else 
      { 
       kolikohinaje = prevzemNow.Count(); 
      } 



      for (int i = 0; i < kolikohinaje; i++) 
      { 
       if (!Object.Equals(prevzemNow[i], prevzemOld[i])) 
       { 
        dobroja = i; 
        return dobroja; 
       } 
       dobroja = i; 
      } 
      return dobroja; 
     } 

Dopo di che è possibile utilizzare che int come punto di partenza per passeggiata attraverso il vostro Ilist

Problemi correlati