我知道List和IEnumerator的基础知识,但我仍然对此感到困惑。我想从字符串中搜索有效的URL。我可以通过LINQ提取有效的URL,但我想使用MatchCollection的IEnumerator GetEnumerator()。
string url = @"http://www.ms.com http://www.hemelix.com http://www.cgi.com";
string pattern = @"http://(www\.)?([^\.]+)\.com";
List<string> result = new List<string>();
MatchCollection myMatches = Regex.Matches(url, pattern);
result = (
from System.Text.RegularExpressions.Match m in myMatches
select m.Value
).ToList<string>();
var result2 = from Match m in myMatches
select m.Value;
foreach (var item in result2)
{
Console.WriteLine(item.ToString());
}
// Does the following code work in this case??
result = (List<string>)myMatches.GetEnumerator();
// OR the following
IEnumerator<string> enumerator = (IEnumerator<string>) (myMatches.GetEnumerator());
while (enumerator.MoveNext())
{
Console.WriteLine(enumerator.Current);
}
答案 0 :(得分:3)
您无法将List转换为IEnumerator,这是完全不同的事情。 List实现IEnumerable,Enumerator用于迭代IEnumerable。
您的(更正的)代码
IEnumerator enumerator = myMatches.GetEnumerator();
while (enumerator.MoveNext())
{
Console.WriteLine(enumerator.Current);
}
与
相同foreach (var item in myMatches)
{
Console.WriteLine(item);
}
答案 1 :(得分:0)
通过Linq将MatchCollection
转换为IEnumerable<string>
对象,这是一种非常简单的方法,但这与您在Linq中使用查询语法所做的类似。这只是一个方法语法版本。
IEnumerable<string> matches = myMatches.Cast<Match>().Select(m => m.Value);
foreach (var match in matches)
{
Console.WriteLine(match);
}
结果:
http://www.ms.com
http://www.hemelix.com
http://www.cgi.com
http://www.ms.com
http://www.hemelix.com
http://www.cgi.com
答案 2 :(得分:0)
主要IEnumerable<T>
操作是从一个实际需要按项目方式(如MoveNext)执行的方法返回的。 Frankly Regex一次性提供匹配列表;所以我没有看到返回IEnumerable
的好处。
据说这里有两种实现相同回报的方法
public static class MyOperations
{
public static string Pattern = @"https?://(www\.)?(?<Url>[^\s]+)";
public static Regex RegexHTTP = new Regex(Pattern, RegexOptions.ExplicitCapture);
public static IEnumerable<string> GetUrl(this string text)
{
return RegexHTTP.Matches(text)
.OfType<Match>()
.Select (mt => mt.Groups["Url"].Value);
}
public static IEnumerable<string> GetUrlEx(this string text)
{
var urls = RegexHTTP.Matches(text)
.OfType<Match>()
.Select (mt => mt.Groups["Url"].Value);
foreach (var url in urls)
yield return url;
}
测试工具
string urls = "http://www.ms.com http://www.hemelix.com http://www.cgi.com http://omegacoder.com";
Console.WriteLine ("GetUrl:");
foreach (string url in urls.GetUrl())
Console.WriteLine ("\t" + url);
Console.WriteLine ("{0}GetUrlEx:", Environment.NewLine);
foreach (string url in urls.GetUrlEx())
Console.WriteLine ("\t" + url);
结果输出
GetUrl:
ms.com
hemelix.com
cgi.com
omegacoder.com
GetUrlEx:
ms.com
hemelix.com
cgi.com
omegacoder.com