2010-05-26 47 views
10

Trong ví dụ đơn giản, có 2 Biểu thức chính quy, một phân biệt chữ hoa chữ thường, chữ kia thì không. Ý tưởng sẽ là hiệu quả tạo một bộ sưu tập IEnumerable (xem "kết hợp" bên dưới) kết hợp các kết quả.Kết hợp MatchCollections một cách hiệu quả trong .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 

} 

Trong thực tế, MatchCollections có thể chứa hàng ngàn kết quả và được chạy thường xuyên sử dụng regexes dài tự động tạo ra, vì vậy tôi muốn né tránh sao chép kết quả vào mảng, vv Tôi vẫn đang học LINQ và mờ về cách đi về việc kết hợp những điều này hoặc những gì hiệu suất đạt đến một quá trình chậm chạp sẽ là.

Trả lời

17

Có ba bước ở đây:

  1. Chuyển đổi MatchCollection 's để IEnumerable<Match>' s
  2. CONCATENATE chuỗi
  3. Lọc theo liệu Match.Success tài sản là đúng

Mã số:

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

Làm điều này tạo ra một điều tra viên mới mà chỉ thực hiện từng bước khi kết quả tiếp theo được tìm nạp, vì vậy bạn chỉ kết thúc đếm từng bộ sưu tập một lần, tổng cộng. Ví dụ: Concat() sẽ chỉ bắt đầu thực hiện điều tra thứ hai sau khi điều tra đầu tiên hết.

+3

Tôi nghĩ .Concat() có thể tốt hơn .Union() ở đây, trừ khi bạn đang cố tình muốn tránh trùng lặp trong kết quả. – jmnben

Các vấn đề liên quan