Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why can I not call Select() from a CaptureCollection object?

Tags:

c#

regex

I have a terrible feeling this may reduce itself to a dummy-on-me, forest-for-trees situation, and if that's the case, mea culpa in advance. But for the life of me I'm just not understanding why the following line will not compile in C#, assuming myRegEx is a RegEx object and myString is the target for a call to the Match method, as follows:

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

The .Captures reference should get me to the CaptureCollection, which implements IEnumerable, and IEnumerable offers an extension method Select for a transform as I've attempted here, snagging the Value property for each item in the collection and pushing it into a string array.

However, the compiler barks at me with

'System.Text.RegularExpressions.CaptureCollection does not contain a definition for 'Select' and no extension method 'Select' accepting a first argument of type System.Text.RegularExpression.CaptureCollection' could be found.

I can overcome this by calling the .Cast<Capture>() method from the Captures object, and then call select with a transform that, in turn, accesses the Value property, but that seems a little silly considering the objects already are Capture objects.

What am I doing wrong? Many thanks in advance for pointing out what must be a painfully obvious oversight on my part.

like image 688
David W Avatar asked Sep 26 '13 18:09

David W


1 Answers

You are not doing anything wrong. MatchCollection and CaptureCollection implement only IEnumerable interface not IEnumerable<T>

That is why you need Cast<T> or OfType<T>

like image 97
L.B Avatar answered Sep 25 '22 07:09

L.B