2010-05-26 16 views
10

ile basitleştirin Basitleştirilmiş örnekte, biri diğerine karşı 2 Normal İfadeler, bir tanesi büyük, diğeri değil. Fikir, etkin ile sonuçların birleştirildiği IEnumerable bir koleksiyon (aşağıda "birleştirildi") oluşturmak olacaktır.Etkinleştirme MatchCollections öğesini .Net Regex

string test = "abcABC"; 
string regex = "(?<grpa>a)|(?<grpb>b)|(?<grpc>c)]"; 
Regex regNoCase = new Regex(regex, RegexOptions.IgnoreCase); 
Regex regCase = new Regex(regex); 

MatchCollection matchNoCase = regNoCase.Matches(test); 
MatchCollection matchCase = regCase.Matches(test); 

//Combine matchNoCase and matchCase into an IEnumerable 
IEnumerable<Match> combined= null; 
foreach (Match match in combined) 
{ 
    //Use the Index and (successful) Groups properties 
    //of the match in another operation 

} 

Uygulamada, MatchCollections sonuçları binlerce içerebilir ve uzun dinamik olarak oluşturulan Regexes kullanarak sık çalıştırılacak, bu yüzden ben hala LINQ öğreniyorum vb diziler sonuçları, kopyalama uzak utangaç istiyorum ve Bunları birleştirmek için ne yapmalı, ne de performansın zaten yavaş bir süreç için ne yapacağı üzerine bulanık.

  1. Match.Success özelliği true

Kod olup olmamasına bakmaksızın diziler s

  • Concatenate 'IEnumerable<Match> için s'
  • Filtre MatchCollection dönüştürme:

  • cevap

    17

    burada üç adım vardır:

    IEnumerable<Match> combined = matchNoCase.OfType<Match>().Concat(matchCase.OfType<Match>()).Where(m => m.Success); 
    

    Bunu yapmak, yalnızca bir sonraki sonuç alınırken her adımı yürüten yeni bir numaralayıcı oluşturur; böylece, her koleksiyonda yalnızca bir kez, sayımla sonuçlanırsınız. Örneğin, Concat() sadece ilk bittikten sonra ikinci sayımı yürütmeye başlayacaktır.

    +3

    Sanırım .Başka bir şekilde sonuçlarda çakışmayı önlemek istemediğiniz sürece .catcat() burada .Union() yönteminden daha iyi olabilir. – jmnben

    İlgili konular