如何转换列表<;字符串>;到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);
}

如何转换列表<;字符串>;到IEnumerator<;字符串>;

不能将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