2010-06-10 14 views
5
IEnumerable<String> existedThings = 
     from mdinfo in mdInfoTotal select mdinfo.ItemNo; 

IEnumerable<String> thingsToSave = 
     from item in lbXReadSuccess.Items.Cast<ListItem>() select item.Value; 

Aquí hay dos IEnumerable.comprobar existencia entre dos IEnumerable

Quiero comprobar si existe value in existedThings en thingsToSave.

O.K. Puedo hacer eso con 3 líneas de código.

bool hasItemNo; 
foreach(string itemNo in existedThings) 
    hasItemNo= thingsToSave.Contains(itemNo); 

Pero, parece sucio.

Solo quiero saber si hay una mejor solución.

+0

¡Perdón por mi pobre inglés! –

+2

No se preocupe, he visto cosas peores de los supuestos hablantes nativos de inglés. ¡Lo estás haciendo bien! –

Respuesta

8
int[] id1 = { 44, 26, 92, 30, 71, 38 }; 
int[] id2 = { 39, 59, 83, 47, 26, 4, 30 }; 

IEnumerable<int> both = id1.Intersect(id2); 

foreach (int id in both) 
    Console.WriteLine(id); 

//Console.WriteLine((both.Count() > 0).ToString()); 
Console.WriteLine(both.Any().ToString()); 

Busca la Enumerable.Intersect Method

+6

Utilice .Any() en lugar de .Count()> 0 para evitar iteraciones innecesarias. –

+0

¡Gracias por eso! – VMAtm

4

Puede utilizar Intersect para lograrlo:

// puts all items that exists in both lists into the inBoth sequence 
IEnumerable<string> inBoth = existedThings.Intersect(thingsToSave); 
4
bool hasItemNo = existedThings.Intersect(thingsToSave).Count() > 0; 

Incluso puede proporcionar su propio comparador si es necesario: Enumerable.Intersect

3

¡Está sucio y tampoco funciona! Su hasItemNo solo sería true si el último valor en existedThings estaba en thingsToSave.

Puesto que usted etiquetado esto con "LINQ", sin embargo, estoy adivinando el código funcionará para usted:

bool hasItemNo = thingsToSave.Intersect(existedThings).Count() > 0 
+0

¡Buena captura en la asignación booleana! +1 – Lazarus

2

No es absolutamente claro en lo que realmente quiere aquí, pero aquí está una sugerencia para sólo el recuperar cadenas que existen en las cosas para guardar y existir cosas.

IEnumerable<String> existedThings = 
     from mdinfo in mdInfoTotal select mdinfo.ItemNo; 

IEnumerable<String> thingsToSave = 
     from item in lbXReadSuccess.Items.Cast<ListItem>() 
     where existedThings.Contains(item.Value) 
     select item.Value; 
8

Las respuestas upvoted propone un algoritmo que tendrá O (n^2) la complejidad si el IEnumerable no se deriva de una clase que implementa ICollection <>. Una consulta Linq por ejemplo. El método de extensión Count() debe iterar todos los elementos para contarlos. Eso no es cool. Sólo es necesario comprobar si el resultado contiene ningún elementos:

bool hasItemNo = existedThings.Intersect(thingsToSave).Any(); 

El orden de las cosas Por cierto, que la enumeración que esperar a tener el menor número de elementos del argumento de Intersección().

+0

+1 para señalar el orden en que usa las colecciones. – rsgoheen

Cuestiones relacionadas