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

Author: Dariusz Woźniak, 2012-06-19

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#.

 119
Author: BrokenGlass,
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