Compruebe si la lista contiene alguna de otra lista
Tengo una lista de parámetros como esta:
public class parameter
{
public string name {get; set;}
public string paramtype {get; set;}
public string source {get; set;}
}
IEnumerable<Parameter> parameters;
Y una matriz de cadenas que quiero comprobar con.
string[] myStrings = new string[] { "one", "two"};
Quiero iterar sobre la lista de parámetros y comprobar si la propiedad source es igual a cualquiera de la matriz myStrings. Puedo hacer esto con foreach anidado, pero me gustaría aprender a hacerlo de una manera más agradable, ya que he estado jugando con linq y como los métodos de extensión en enumerable, como donde etc foreachs anidados simplemente se sienten mal. Hay un más elegante preferido linq / lambda / delegete manera de hacer esto.
Gracias
1 answers
Podría usar un Any()
anidado para esta comprobación que está disponible en cualquier Enumerable
:
bool hasMatch = myStrings.Any(x => parameters.Any(y => y.source == x));
Un rendimiento más rápido en colecciones más grandes sería proyectar parameters
a source
y luego usar Intersect
que internamente usa un HashSet<T>
así que en lugar de O (n^2) para el primer enfoque (el equivalente de dos bucles anidados) puede hacer la comprobación en O(n):
bool hasMatch = parameters.Select(x => x.source)
.Intersect(myStrings)
.Any();
También como comentario lateral, debe poner en mayúscula los nombres de las clases y los nombres de las propiedades para ajustarse a las pautas de estilo de C#.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-19 00:43:28