2009-07-08 16 views
10

Volevo eseguire una query LINQ su un oggetto MatchCollection ma ho trovato che ciò non era possibile in quanto non implementa ICollection<T>, solo ICollection.Utilizzo di LINQ con classi che implementano ICollection non generico

Qual è l'opzione migliore per l'utilizzo di LINQ con raccolte non generiche, sia in termini di codifica del codice, ma anche di prestazioni e utilizzo della memoria?

(Se interessati, ecco il codice non LINQuified :)

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

risposta

10

È possibile includere anche il filtro someString con LINQ.

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 
} 

Si noti che il compilatore traduce una query come questa ...

var q = from MyType x in myEnum select x; 

... in questo ...

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

... in modo che comprende sia il tipo e la Cast<T>() è ridondante.

Per quanto riguarda le prestazioni, Cast<T>() esegue semplicemente un cast di tipo esplicito e restituisce il valore, pertanto il risultato della performance sarà trascurabile. Per le raccolte legacy in cui non sei sicuro che tutti i membri siano del tipo desiderato, puoi utilizzare invece OfType<T>().

+0

Per qualche motivo non pensavo che funzionasse come MatchCollection non è generico. Credo che avrei dovuto provarlo! La tua spiegazione della traduzione del compilatore è stata molto utile. –

3

tenta di utilizzare il metodo di estensione Fusioni che restituirà un IEnumerable.

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

E evento se non si utilizza il metodo Fusioni il compilatore dedurre il tipo di "query" di IEnumerable.

var query = from Match v in fieldValues 
         select v; 
Problemi correlati