如何使用LINQ为每个项调用方法?

时间:2015-10-14 20:01:25

标签: c# linq linq-to-xml

我正在尝试为列表项本身传递该方法时为列表中的每个项调用一个方法。基本上我可以用抽出的方式做到这一点但是试图在一个简洁的LINQ语句中得到它:

var urls = html.DocumentNode.SelectNodes("//a[@href]")
             .Select(a => a.Attributes["href"].Value)
             .Where(href => !href.StartsWith("mailto:")) // skip emails, find only url links
             .ToList();
            //.ToList().ForEach(href => getWEbData(href.ToString ()));

            foreach (string s in urls) {
                getWEbData(s);
            }
  

我无法弄清楚如何将.ForEach()放入LINQ   简写或如果可能的话。

4 个答案:

答案 0 :(得分:2)

你做不到。 LINQ功能旨在不会产生副作用。 ForEach旨在引起副作用。因此,没有ForEach LINQ函数。

见Eric Lippert的"foreach" vs "ForEach"

答案 1 :(得分:1)

请勿尝试将foreach与Linq一起使用。 Id不添加任何值,使调试更加困难。您可以foreach调用中嵌入查询,如下所示:

foreach (string s in html.DocumentNode
                         .SelectNodes("//a[@href]")
                         .Select(a => a.Attributes["href"].Value)
                         .Where(href => !href.StartsWith("mailto:"))) 
{
    getWEbData(s);
}

请注意,ToList()是不必要的(无论您是在foreach内部还是外部进行查询)

答案 2 :(得分:0)

你可以使用foreq和Linq,但最好有一个构造函数,即在Select语句中获取一个新的类对象,并在构造函数中创建该类的参数化构造函数,你可以做任何你想做的最简单的一个有效的方式。

答案 3 :(得分:-1)

没有LINQ .ForEach方法,但您可以轻松编写自己的方法:

public static class IEnumerableExtensions {
   public static void ForEach<T>(this IEnumerable<T> pEnumerable, Action<T> pAction) {
      foreach (var item in pEnumerable)
         pAction(item);
   }
}

然后

html
.DocumentNode
.SelectNodes("//a[@href]")
.Select(a => a.Attributes["href"].Value)
.Where(href => !href.StartsWith("mailto:")) // skip emails, find only url links
.ForEach(href => getWEbData(href.ToString ()));

或略好一些(虽然我认为href可能已经是string):

...
.Select(href => href.ToString())
.ForEach(getWEbData);

虽然正如其他人所指出的那样,只是因为你并不一定意味着你应该这样做,但那不是你的问题。