2010-02-15 19 views
40

Dadas 2 matrices en el int., P. Ej., Foo y barra, ¿cuál es la forma más eficiente de comprobar que la barra de la matriz contiene al menos un elemento que contiene foo? debería devolver verdadero/falso.compruebe si una matriz contiene algún elemento de otra matriz

estoy sospechando foreach anidado, pero me preguntaba si hay una manera más agradable.

+0

¿Es esta tarea? ¿Las matrices son arbitrariamente grandes o más pequeñas que, por ejemplo, 100 elementos? ¿Has probado algo más que foreach de fuerza bruta? –

+0

no es tarea no! ... pensé que probablemente hay una buena manera de hacer esto. – raklos

Respuesta

87

Usando LINQ:

array1.Intersect(array2).Any() 
+3

El uso de Any() asegura que el algoritmo de intersección se detiene cuando se encuentra el primer objeto igual. – Olli

+5

tenga en cuenta que todo el array1 está enumerado, por lo que probablemente desee el array más corto como array1 si es posible –

+2

Nunca escuché sobre el método Intersect así que tuve que buscar lo que hace: http://msdn.microsoft.com/en -us/library/bb460136.aspx Básicamente le da una lista de elementos que se encuentran en las dos matrices comparadas. Con cualquier operador, usted sabe si array1 y array2 tienen cualquiera de las mismas cadenas en este caso. – Stefanvds

1

Sí bucles anidados, aunque uno se oculta:

bool AnyAny(int[] A, int[]B) 
{ 
    foreach(int i in A) 
     if (B.Any(b=> b == i)) 
      return true; 
    return false; 
} 
6

C# 3:

bool result = bar.Any(el => foo.Contains(el)); 

C# 4 ejecución en paralelo:

bool result = bar.AsParallel().Any(el => foo.AsParallel().Contains(el)); 
+0

En mi caso foo es una subcadena de el. por lo tanto, 'bool result = bar.Any (el => foo.Contains (el));' no dará el resultado requerido. ¿Alguna sugerencia de cómo implementar esta consulta? –

0

Para el enfoque de matriz aleatoria de un solo intento, su método parece ser el más rápido. Hay métodos que lo harán mucho más eficiente si una o ambas matrices están ordenadas, sus límites superiores/inferiores son conocidos, o uno de ellos cambia mucho más raramente que el otro y usted realiza muchas comprobaciones. La cosa es que puedes preparar varios hash, índices y pistas que optimizarán la búsqueda a casi nada, pero el proceso de indexación solo generalmente tomará más de una búsqueda.

Cuestiones relacionadas