2010-06-01 19 views
7

Tengo dos listas de enteros (List<int>). Ellos contienen los mismos elementos, pero Lista 1 contiene elementos que no están en la Lista 2.Buscar elementos "no iguales" en dos matrices

¿Cómo encontrar qué elementos de la Lista 1 no están en la Lista 2.

Gracias :)

PD. lang es C#

Respuesta

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

Si no están ordenados o algo así, vas a tener un momento difícil.

O bien algoritmo O (N^2) (un bucle simple, estúpido) o estructuras de datos adicionales, dime cuál prefieres.

O, por supuesto, puede alterar los datos de origen mediante la clasificación, lo que supongo que no es una opción.

+1

¿De qué manera no es posible ordenarlos en O (N log N)? – Pieter

+0

Bueno, podrías ordenar por radix las listas O (kN) y calcular la diferencia O (N). – kennytm

18

Puede utilizar IEnumerable.Except:

list1.Except(list2); 
+0

+1. Me has vencido. – brickner

+0

no pudo hacer esto porque el argumento de Except debe ser IEnumerable. La lista como argumento es inaceptable. – trnTash

+3

@trnTash: List implementa IEnumerable . El código es correcto – dtb

0

Por simplicidad se puede utilizar el método contiene y compruebe si hay una lista no contiene un elemento de la otra:

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

Esto es al revés, y un algoritmo O (N^2). –

+0

esto podría funcionar bien, pero la otra solución es mucho más rápida y menos código – trnTash

1

Un muy fácil solución:

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

HashSet ayudó después de todo. ¡Gracias! – trnTash

+5

¿Se da las gracias por su propia respuesta? –

+2

No. Al tipo que eliminó su publicación. – trnTash

0

Si su solución es que la lista de abetos contiene segundos y para la caza registros onli añadido después de la primera lista, Tal vez esto va a ser útil

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

Después de que usted puede usar ese int como punto de partida para la cubeta de paseo a su Ilist

Cuestiones relacionadas