2013-09-26 174 views
7

Tôi có một cảm giác khủng khiếp, điều này có thể làm giảm tình trạng của tôi đối với tình huống giả tạo, rừng cây, và nếu đó là trường hợp, trước tiên là mea culpa. Nhưng đối với cuộc sống của tôi Tôi chỉ không hiểu tại sao dòng sau sẽ không biên dịch trong C#, giả sử myRegEx là một đối tượng RegExmyString là mục tiêu cho một cuộc gọi đến các phương pháp Match, như sau:Tại sao tôi không thể gọi Chọn() từ đối tượng CaptureCollection?

String[] results = myRegEx.Matches(myString)[0].Groups["Group1"].Captures.Select(x => x.Value).ToArray<String>(); 

Tham chiếu .Captures sẽ đưa tôi đến số CaptureCollection, thực hiện IEnumerableIEnumerable cung cấp phương thức mở rộng Select cho phép biến đổi như tôi đã cố gắng ở đây, snagging tài sản Value cho mỗi mục trong bộ sưu tập và đẩy nó vào một mảng chuỗi.

Tuy nhiên, trình biên dịch sủa tôi với

'System.Text.RegularExpressions.CaptureCollection không chứa một định nghĩa cho 'Chọn' và không có phương pháp mở rộng 'Chọn' chấp nhận một đối số đầu tiên loại System.Text.RegularExpression.CaptureCollection 'có thể được tìm thấy.

tôi có thể khắc phục điều này bằng cách gọi phương pháp .Cast<Capture>() từ đối tượng chụp, và sau đó gọi chọn với một biến đổi đó, đến lượt mình, truy cập vào Value bất động sản, nhưng điều đó dường như một chút ngớ ngẩn xem xét các đối tượng đã Capture đối tượng.

Tôi đang làm gì sai? Rất cám ơn trước đã chỉ ra những gì phải là một sự giám sát rõ ràng đau đớn về phía tôi.

+1

Bạn không làm điều gì sai trái. MatchCollection và CaptureCollection chỉ thực hiện 'IEnumerable' không phải là' IEnumerable ' –

+0

AAAAARRRRRGGGHHH !!!!!!!! Tất nhiên. Cảm ơn bạn. Đăng câu trả lời đó và tôi sẽ rất vui khi được chấp nhận. –

Trả lời

9

Bạn không làm gì sai. MatchCollectionCaptureCollection thực hiện chỉ IEnumerable giao diện không IEnumerable<T>

Đó là lý do tại sao bạn cần Cast<T>or OfType<T>