2009-07-08 7 views
10

Ich wollte eine LINQ-Abfrage für ein MatchCollection Objekt ausführen, aber fand dies nicht möglich, da es ICollection<T>, nur ICollection implementiert nicht.Verwenden von LINQ mit Klassen implementieren nicht generische ICollection

Was ist die beste Option für LINQ mit nicht-generischen Sammlungen, sowohl in Bezug auf Code Prägnanz, sondern auch die Leistung und Speichernutzung?

(Bei Interesse ist hier der nicht-LINQuified Code :)

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

Antwort

10

Sie können auch Ihren someString Filter mit LINQ einschließen.

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 
} 

Beachten Sie, dass der Compiler eine Abfrage wie folgt übersetzt ...

var q = from MyType x in myEnum select x; 

... in diese ...

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

... so einschließlich der Art und Cast<T>() ist redundant.

Leistungsmäßig Cast<T>() tut nur eine explizite Art und wirft den Wert, so dass der Leistungseinbruch vernachlässigbar sein wird. Bei älteren Sammlungen, bei denen Sie nicht sicher sind, ob alle Mitglieder den gewünschten Typ haben, können Sie stattdessen OfType<T>() verwenden.

+0

Aus irgendeinem Grund ich dies nicht glaubte würde als Match Arbeit ist nicht generisch. Ich hätte es ausprobieren sollen! Ihre Erklärung der Compiler-Übersetzung war sehr hilfreich. –

3

Versuchen Sie, die Cast-Erweiterung Methode zu verwenden, die eine IEnumerable zurück.

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

Und Ereignis, wenn Sie verwenden, um die Cast-Methode nicht der Compiler den Typ der „Abfrage“ auf IEnumerable schließen.

var query = from Match v in fieldValues 
         select v; 
Verwandte Themen