Pregunta

quería ejecutar una consulta LINQ contra un objeto MatchCollection pero encontró que esto no era posible, ya que no implementa ICollection<T>, simplemente ICollection.

¿Cuál es la mejor opción para el uso de LINQ con colecciones no genéricas, tanto en términos de la concisión código, sino también el rendimiento y uso de 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
    }
}
¿Fue útil?

Solución

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>() sólo lo hace un tipo de conversión explícita y produce el valor, por lo que el impacto en el rendimiento será insignificante. Para las colecciones de legado en el que no está seguro de que todos los miembros son del tipo deseado, puede utilizar OfType<T>() lugar.

Otros consejos

Trate de usar 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 se utiliza el método moldeada el compilador inferirá el tipo de "consulta" a IEnumerable.

  var query = from Match v in fieldValues
                        select v;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top