2012-06-19 14 views
49

Tengo una lista de los parámetros de la siguiente manera:Comprobar si la lista contiene <t> cualquiera de otra lista

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 que en contra.

string[] myStrings = new string[] { "one", "two"}; 

Quiero iterar sobre la lista de parámetros y comprobar si la propiedad fuente 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 me gusta los métodos de extensión en enumerable, como dónde, etc., por lo que los foreachs anidados se sienten mal. ¿Existe una manera más elegante y preferida de linq/lambda/delegete para hacer esto?

Gracias

Respuesta

105

Se puede usar un anidado Any() para esta comprobación, que está disponible en cualquier Enumerable:

bool hasMatch = myStrings.Any(x => parameters.Any(y => y.source == x)); 

más rápido rendimiento sobre las colecciones más grandes sería proyectar parameters-source y luego utilice Intersect cuales internamente utiliza un HashSet<T> entonces en lugar de O (n^2) para el primer acercamiento (el equivalente de dos bucles anidados) puede hacer el control en O (n):

bool hasMatch = parameters.Select(x => x.source) 
          .Intersect(myStrings) 
          .Any(); 

También como comentario lateral, debe poner en mayúscula sus nombres de clases y nombres de propiedades para cumplir con las pautas de estilo de C#.

+0

gracias parece ser lo que estoy buscando voy a probarlo. Necesita jugar un poco más con el lado funcional de las cosas. con respecto a la capitalización de clase y propiedades, lo hice simplemente se me olvidó cuando escribí el ejemplo anterior. – gdp

+0

¿Por qué O (n^2)? ¿No es O (n * m) ya que estamos hablando de dos variables y no una? Como m (los parámetros) son una constante, es lo mismo que O (n). No veo cómo la intersección debería ser mucho más rápida aquí? Pero de acuerdo, Intersect tiene el potencial de ser más rápido, pero no está garantizado. – Squazz

+0

Tiene razón en que debería ser O (n * m) - m no es una constante - es el tamaño de una de las listas, aunque en el ejemplo particular dado podría ser "2". Incluso valores constantes no son insignificantes en la práctica; para todas las longitudes de lista no triviales, el 'Intersecto' será más rápido; si las listas son trivialmente cortas, no importa de una manera u otra (en ese caso, el rendimiento probablemente no sea tu problema) de todos modos) – BrokenGlass

Cuestiones relacionadas