如何将List <string>转换为IEnumerator <string>

时间:2015-12-05 19:25:51

标签: c# linq

我知道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);
}

3 个答案:

答案 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