MatchCollection类型集合中的项的基础类型是什么?

时间:2015-11-08 18:48:06

标签: c# .net

我认为它的类型为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()); 

但也许你可以建议一种更紧凑,更优雅的方式来完成这项工作。

3 个答案:

答案 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的基础类型确实是MatchGetEnumerator()返回一个简单的IEnumerator(即版本之前的约会泛型,其中所有元素都是对象,您需要自己投射它们。)

通常你会像这样处理循环中的所有项目:

for (int i = 0; i < friendULs.Count; i++)
{
    Match thisMatch = friendULs[i];
    ...
}

您可以使用MatchCollectionIEnumerable<Match>转换为friendsULs.OfType<Match>()