2009-07-08 12 views
10

Quería ejecutar una consulta LINQ contra un objeto MatchCollection pero encontré que esto no fue posible ya que no implementa ICollection<T>, solo ICollection.Usando LINQ con clases que implementan ICollection no genérico

¿Cuál es la mejor opción para usar LINQ con colecciones no genéricas, tanto en términos de concisión del código como de rendimiento y uso de la memoria?

(Si está interesado, aquí está el código no LINQuified :)

MatchCollection fieldValues = Regex.Matches(fieldValue, @"(?<id>\d+);#(?<text>[^;|^$]+)"); 
foreach (Match m in fieldValues) 
{ 
    if (m.Groups["text"].Value.Equals(someString)) 
    { 
     // Do stuff 
    } 
} 

Respuesta

10

Puede incluir su filtro someString con LINQ también.

var matches = Regex.Matches(fieldValue, @"(?<id>\d+);#(?<text>[^;|^$]+)"); 
var textMatches = from Match m in matches 
        where m.Groups["text"].Value.Equals(someString) 
        select m; 

foreach (Match m in textMatches) 
{ 
    // Do stuff 
} 

Tenga en cuenta que el compilador traduce una consulta como esta ...

var q = from MyType x in myEnum select x; 

... en esto ...

var q = from x in myEnum.Cast<MyType>() select x; 

... por lo que incluir tanto el tipo como Cast<T>() es redundante.

En cuanto al rendimiento, Cast<T>() simplemente realiza un molde de tipo explícito y produce el valor, por lo que el rendimiento será insignificante. Para colecciones heredadas en las que no está seguro de que todos los miembros sean del tipo deseado, puede usar OfType<T>() en su lugar.

+0

Por alguna razón no pensé que esto funcionaría ya que MatchCollection no es genérico. Creo que debería haberlo intentado! Su explicación de la traducción del compilador fue muy útil. –

3

intenta utilizar el método de extensión moldeada que devolverá un IEnumerable.

IEnumerable<Match> query = from Match m in fieldValues.Cast<Match>() 
          select m; 

Y evento si no utilizan el método moldeada el compilador inferirá el tipo de "consulta" a IEnumerable.

var query = from Match v in fieldValues 
         select v; 
Cuestiones relacionadas