2009-07-08 18 views
10

'u uygulayan sınıflarla LINQ kullanma MatchCollection nesnesine karşı bir LINQ sorgusu çalıştırmak istedim, ancak bunun ICollection<T>, yalnızca ICollection uygulanmadığı için bu mümkün değildi.Genel olmayan ICollection

Kod eşitliği açısından değil, aynı zamanda performans ve bellek kullanımı açısından LINQ jenerik olmayan koleksiyonlarla kullanmak için en iyi seçenek hangisidir?

(ilgi, burada olmayan LINQuified kod :) IEnumerable dönecektir Cast uzantısının yöntemi kullanmak

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

cevap

10

someString filtrenizi LINQ ile de ekleyebilirsiniz. böylece tipi ve hem de dahil olmak üzere derleyici böyle bir sorgu çevirir olduğunu

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 
} 

Not ... Bu içine

var q = from MyType x in myEnum select x; 

...

...

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

... Cast<T>() yedeklidir.

Performans açısından, Cast<T>() sadece açık bir tür döküm yapar ve değeri verir, bu nedenle performans isabet ihmal edilebilir. Tüm üyelerin istenen türde olduğundan emin olmadığınız eski koleksiyonlar için OfType<T>()'u kullanabilirsiniz.

+0

Bazı nedenlerden dolayı bunun MatchCollection'ın genel olmadığından işe yaramadığını düşünmüyorum. Sanırım denemeliydim! Derleyici çevirisiyle ilgili açıklamanız çok yardımcı oldu. –

3

deneyin olduğunu.

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

Ve olay derleyici IEnumerable "sorgusu" türünü ortaya çıkarabileceği edecek Cast yöntemi kullanmak yoksa.

var query = from Match v in fieldValues 
         select v; 
İlgili konular