我认为它的类型为Match
,但这不正确,因为我收到了错误
无法隐式转换类型'System.Collections.IEnumerator' 输入 “System.Collections.Generic.IEnumerator
就行了
IEnumerator<Match> friendsULsEnumerator = friendsULs.GetEnumerator();
其中friendsULs
的类型为MatchCollection
。我试着做了
var friendsULsEnumerator = friendsULs.GetEnumerator();
并将鼠标悬停在var
上以查看Visual Studio是否告诉我特定类型,但它只显示IEnumerable
。 :(
为了扩大我的问题以解决我的问题,我正试图从string
<h2>Friends</h2><ul><li>Donald Trump</li><li>Hillary Clinton</li>...</ul>
只在较大的字符串中出现一次。所以我拥有的是
MatchCollection friendsULs = DataReader._fregx.Matches(sr.ReadToEnd());
if ( friendsULs.Count != 1 ) throw new Exception(String.Format("Couldn't find exactly one piece of HTML matching {0}",
DataReader._fregx.ToString()));
IEnumerator<Match> friendsULsEnumerator = friendsULs.GetEnumerator();
if ( friendsULsEnumerator.MoveNext() ) { } // because MoveNext() returns a bool, this useless block is necessary
MatchCollection friendsLIs = DataReader._lregx.Matches(friendsULsEnumerator.Current.ToString());
但也许你可以建议一种更紧凑,更优雅的方式来完成这项工作。
答案 0 :(得分:2)
您正在调用的方法GetEnumerator
是由非通用 IEnumerable
接口定义的方法。它返回非通用IEnumerator
,与IEnumerator<T>
不同。所以回答你的问题:MatchCollection
确实是Match
个对象的集合,但由于它没有实现通用的IEnumerable<Match>
接口,你需要手动“强制转换”。 OfType
方法正是如此:将非泛型IEnumerable
集合转换为指定类型的通用集合。
那就是说,GetEnumerator
是你在“规范C#”中很少需要的方法。从您的代码示例中,您似乎只需要获取集合中的第一个Match
。使用LINQ可以更轻松,更优雅,例如使用Single
运算符:
Match match = friendsULs.OfType<Match>().Single();
答案 1 :(得分:1)
您可以使用以下方法轻松迭代匹配:
foreach(Match match in friendsULs)
// do whatever with match here
这是迭代枚举的NET 1.0模式,因为当时没有泛型。
答案 2 :(得分:0)
MatchCollection
的基础类型确实是Match
。 GetEnumerator()
返回一个简单的IEnumerator
(即版本之前的约会泛型,其中所有元素都是对象,您需要自己投射它们。)
通常你会像这样处理循环中的所有项目:
for (int i = 0; i < friendULs.Count; i++)
{
Match thisMatch = friendULs[i];
...
}
您可以使用MatchCollection
将IEnumerable<Match>
转换为friendsULs.OfType<Match>()
。