如何转换列表<;字符串>;到IEnumerator<;字符串>;
本文关键字:lt 字符串 gt IEnumerator 列表 何转换 转换 | 更新日期: 2023-09-27 18:25:57
我知道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);
}
不能将List转换为IEnumerator,这是完全不同的事情。List实现了IEnumerable,Enumerator是用于迭代IEnumeraable的东西。
您的(已更正)代码
IEnumerator enumerator = myMatches.GetEnumerator();
while (enumerator.MoveNext())
{
Console.WriteLine(enumerator.Current);
}
和一样
foreach (var item in myMatches)
{
Console.WriteLine(item);
}
这里有一种通过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
IEnumerable<T>
操作主要是从一个方法返回的,该方法实际上需要以诸如MoveNext之类的逐项方式进行操作。坦率地说,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