![](/img/trans.png)
[英]Why does RegularExpressions.GroupCollection enumerable not work with Linq extension methods?
[英]Enumerable extension methods inaccessible on GroupCollection
根据文档, GroupCollection
Class 实现了通用的IEnumerable
接口。 它的扩展方法甚至列在该页面的下面。 然而,我得到
编译错误(第 16 行,第 4 列):“GroupCollection”不包含“Skip”的定义,并且找不到接受“GroupCollection”类型的第一个参数的可访问扩展方法“Skip”(您是否缺少 using 指令或装配参考?)
对于以下代码:
using System.Linq;
var currency = "HUF";
var origin = "Modlin";
var changes = 3;
System.Console.WriteLine(
new[] {
$"Cost: 50 {currency}",
$"Departure airport: {origin}",
$"Number of changes: {changes}"
}[
System.Text.RegularExpressions.Regex.Matches(
"variable elem: blablaoriginbleble",
"(currency)|(origin)|(changes)"
)[0]
.Groups
.Skip(1)
.Select((m, i) => (m, i))
.First(p => p.Item1.Success)
.Item2
]);
如果我用((System.Collections.Generic.IEnumerable<System.Text.RegularExpressions.Group>)
和)
包围 L11-15,错误就会消失。 为什么有必要?
更奇怪的是,省略[0]
和.Groups
(在语义上不等同,只是为了实验)也不会导致错误。 在这种情况下,扩展方法Skip
、 Select
和First
在 MatchCollection 的实例上MatchCollection
。 它也实现了IEnumerable
,并且似乎行为应该是类似的。
编辑2:
我刚刚在 .NET 6 中测试了您的代码,并得到了相同的错误消息。 我变了:
.Skip(1)
至:
.Skip<System.Text.RegularExpressions.Group>(1)
它奏效了。 我认为问题在于,因为GroupCollection
为两种特定类型T
( Group
和KeyValuePair<string,Group>>
)实现了两次IEnumerable<T>
,所以无法从使用中推断出该类型。 这意味着您需要在调用Skip
时指定泛型类型参数,以便它知道要使用哪个实现。 这几乎就像您在对该问题的评论中所推测的那样。
编辑:
我将在下面留下我的原始答案,但是考虑到您的代码,您似乎正在使用顶级语句,因此这意味着您正在使用 .NET 6。我想我们会在您回复时看到。 如果你是那么我不确定原因是什么。
原来的:
该文档适用于 .NET 6。我猜您使用的是早期版本。 您应该在该页面的左上角 select 您的 .NET 版本,我希望您会发现,在该版本中, GroupCollection
实现的接口要少得多。 例如,它仅在 .NET Framework 4.8 中实现了ICollection
。 您可以做的是调用Cast<T>
来获取IEnumerable<T>
然后访问该接口的所有扩展方法:
using System.Linq;
using System.Text.RegularExpressions;
var currency = "HUF";
var origin = "Modlin";
var changes = 3;
System.Console.WriteLine(
new[] {
$"Cost: 50 {currency}",
$"Departure airport: {origin}",
$"Number of changes: {changes}"
}[
Regex.Matches(
"variable elem: blablaoriginbleble",
"(currency)|(origin)|(changes)"
)[0]
.Groups
.Cast<Group>()
.Skip(1)
.Select((m, i) => (m, i))
.First(p => p.Item1.Success)
.Item2
]);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.