Question

Je voulais exécuter une requête LINQ contre un objet MatchCollection mais cela n'a pas été trouvé possible car il ne met pas en œuvre ICollection<T>, juste ICollection.

Quelle est la meilleure option pour utiliser LINQ avec des collections non génériques, tant en termes de code, mais aussi la performance concision et utilisation de la mémoire?

(Si vous êtes intéressé, voici le code non LINQuified:)

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

La solution

Vous pouvez inclure votre filtre someString avec LINQ ainsi.

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
}

Notez que le compilateur se traduit par une requête comme ça ...

var q = from MyType x in myEnum select x;

... dans ce ...

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

... comprenant à la fois le type et Cast<T>() est redondant.

Côté performance, Cast<T>() fait juste un casting de type explicite et donne la valeur, de sorte que le succès de la performance sera négligeable. Pour les collections patrimoniales où vous n'êtes pas sûr que tous les membres sont du type désiré, vous pouvez utiliser OfType<T>() à la place.

Autres conseils

Essayez d'utiliser la méthode d'extension Cast qui retournera un IEnumerable.

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

Et l'événement si vous n'utilisez la méthode Cast le compilateur déduire le type de « requête » à IEnumerable.

  var query = from Match v in fieldValues
                        select v;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top