Tengo dos listas de la siguiente manera:
List<string> l1 = new List<string>( new string[]{ "United States", "Brazil", "India", "Canada" }); List<string> l2 = new List<string>( new string[]{ "Asia:India", " North America:Canada", "EU:Germany" }) ; ¿Cómo enumerar todos los elementos de l2 que contienen la cadena en l1 usando Linq Lambda?
Salida deseada
"Asia:India" "North America:Canada"Para cada elemento de la segunda lista, compruebe si hay algún elemento de la primera lista que forme parte del elemento:
l2.Where(i => l1.Any(j => i.Contains(j));Tenga en cuenta que esto puede ser lento para listas grandes.
Si tiene muchos países para buscar, sugiero usar HashSet<string> (tiene mejor Complejidad de tiempo, O(1) vs O(N) ):
HashSet<string> countries = new HashSet<string>() { "United States", "Brazil", "India", "Canada", }; Para crear countries desde l1 :
HashSet<string> countries = new HashSet<string>(l1);Entonces puedes poner un Linq simple:
var result = l2 .Where(item => countries.Contains(item.Substring(item.IndexOf(':') + 1))); Sus datos tienen una estructura interna: Area:Country que podemos explotar con la ayuda de Substring e IndexOf
Manifestación:
var l1 = new List<string>() { "United States", "Brazil", "India", "Canada", "Congo", // <- My special test case }; var l2 = new List<string>() { "Asia:India", "North America:Canada", "EU:Germany", "Africa:Democratic Republic of Congo" }; HashSet<string> countries = new HashSet<string>(l1); var result = l2 .Where(item => countries.Contains(item.Substring(item.IndexOf(':') + 1))); Console.Write(string.Join("; ", result));Salir:
Asia:India; North America:Canada Tenga en cuenta la ausencia de Africa:Democratic Republic of Congo : El Congo y Democratic Republic of Congo son estados diferentes .
Editar: solución Linq Join
var result = l2.Join( l1, item => item.Substring(item.IndexOf(':') + 1), item => item, (left, right) => left);