2011-05-16 30 views
5

pregunta principal:
Ok chicos, aquí está la situación, vamos a considerar 2 matrices de cadenas:Cómo comprobar si las cadenas en una matriz contienen cadenas de otra matriz

string foo = { "Roses are #FF0000" , "Violets are #0000FF", "Paint it #000000"} 
string bar = { "Guns", "Roses", "Violets"} 

¿Cuál es el "código de menor cantidad líneas "forma de recuperar cadenas en foo que contienen cadenas en la barra?
(es decir, en este caso, los 2 primeros elementos de foo)

Por supuesto que quiero evitar hacer toda la lógica "a mano", como estoy seguro de LINQ es más eficiente con la función de intersección, pero no sé cómo usarlo para realizar esta tarea precisa.

criterios de desempate:
1 - ¿Qué pasa si foo contiene cadenas que contienen más de un elemento de la barra,

string foo = { "Roses are #FF0000" , "Violets are #0000FF", "Paint it #000000"} 
string bar = { "Roses", "Violets", "are"} 

Y quiero evitar duplicados?

2 - ¿Qué sucede si tengo 2 matrices de "barras" que quiero verificar contra una matriz foo?
¿Es más eficiente fusionar bar1 y bar2 o realizar el filtro primero con bar1 y luego con bar2?


Gracias y divertirse contestar :-)

Respuesta

6

LINQ funciona bien, sí:

var mixed = foo.Where(x => bar.Any(y => x.Contains(y)); 

en cuenta que todavía sólo verá cada elemento de foo una vez, en todo caso.

Si tiene varios bar matrices, puede utilizar:

var mixed = foo.Where(x => bar1.Concat(bar2) 
           .Any(y => x.Contains(y)); 
1
string[] foo = new string[] { "Roses are #FF0000", "Violets are #0000FF", "Paint it #000000" }; 
string[] bar = new string[] { "Guns", "Roses", "Violets" }; 

var matches = from f in foo 
       where bar.Any(b => f.Contains(b)) 
       select f; 

foreach (var m in matches) 
    Console.WriteLine(m); 
+0

Sí esto funciona también (que era la sintaxis He estado usando hace un par de años), aunque es más rápido prescindir de las declaraciones select y from. Gracias. –

+0

@Mika, prefiero la sintaxis de la consulta, especialmente cuando las consultas crecen más que este tamaño. Lo encuentro más legible –

2

Suponiendo que el string en su descripción es errata de su maestro,

var result=foo.Where(w=>bar.Any(iw=>w.Contains(iw))); 

No estoy seguro de lo que duplica quiere decir que solo mostrará elementos en foo una vez, sin importar cuántas veces aparezcan en bar.

En cuanto al segundo desempate, todo lo que tiene que hacer es algo como esto:

var result=foo.Where(w=>bar1.Any(iw=>w.Contains(iw))||bar2.Any(iw=>w.Contains(iw))); 
+0

ThanX Funciona bien, pero tuve que invertir 'iw => iw.Contains (w)' to 'iw => w.Contains (wi)' para que funcione. Además, cambié el || a && (He elegido tu última propuesta de sintaxis porque tiene sentido para mí, forma una perspectiva de lectura de código. –

+0

|| significa en cualquiera de ellos, && significa en ambos, supuse que querías decir el primero. – Blindy

Cuestiones relacionadas