为了解释原因:
LINQ本质上是功能性的.它用于查询数据和返回结果.LINQ查询不应该改变应用程序的状态(有一些例外,如缓存).因为foreach不会返回任何结果,所以它没有很多用途,除了你传递给它之外,不涉及改变某些状态.如果你需要一个Foreach()扩展方法,这是很容易滚你自己.
另一方面,如果你想要的是获取输入并在返回结果的每个项上调用函数,LINQ提供了一种通过其select方法的方法.
例如,以下代码在列表中的每个项目上调用函数委托,如果该项目为正,则返回true:
static void Main(string[] args) { IEnumerablelist = new List () { -5, 3, -2, 1, 2, -7 }; IEnumerable isPositiveList = list.Select (i => i > 0); foreach (bool isPositive in isPositiveList) { Console.WriteLine(isPositive); } Console.ReadKey(); }
请参阅http://stackoverflow.com/questions/858978/lambda-expression-using-foreach-clause和http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs上的确认-foreach.aspx (2认同)
Omer Mor.. 10
实际上,Microsoft Research的Reactive Extensions框架确实添加了此功能.在System.Interactive
集会中,他们包括了一个Run()
和一个Do()
扩展IEnumerable
.
Do(action)将对每个元素执行操作并将其返回.这对于将记录添加到linq查询非常有用,例如:
var res = GetRandomNumbers(100).Take(10) .Do(x => Console.WriteLine("Source -> {0}", x)) .Where(x => x % 2 == 0) .Do(x => Console.WriteLine("Where -> {0}", x)) .OrderBy(x => x) .Do(x => Console.WriteLine("OrderBy -> {0}", x)) .Select(x => x + 1) .Do(x => Console.WriteLine("Select -> {0}", x));
这将导致:
Source -> 96 Where -> 96 Source -> 25 Source -> 8 Where -> 8 Source -> 79 Source -> 25 Source -> 3 Source -> 36 Where -> 36 Source -> 51 Source -> 53 Source -> 81 OrderBy -> 8 Select -> 9 9 OrderBy -> 36 Select -> 37 37 OrderBy -> 96 Select -> 97 97
运行(动作)就像一个foreach循环,这意味着它折叠执行动作的序列.
你可以在这里阅读更多相关信息:http://community.bartdesmet.net/blogs/bart/archive/2009/12/26/more-linq-with-system-interactive-the-ultimate-imperative.aspx
Rx框架可以在这里找到:http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx
为了解释原因:
LINQ本质上是功能性的.它用于查询数据和返回结果.LINQ查询不应该改变应用程序的状态(有一些例外,如缓存).因为foreach不会返回任何结果,所以它没有很多用途,除了你传递给它之外,不涉及改变某些状态.如果你需要一个Foreach()扩展方法,这是很容易滚你自己.
另一方面,如果你想要的是获取输入并在返回结果的每个项上调用函数,LINQ提供了一种通过其select方法的方法.
例如,以下代码在列表中的每个项目上调用函数委托,如果该项目为正,则返回true:
static void Main(string[] args) { IEnumerablelist = new List () { -5, 3, -2, 1, 2, -7 }; IEnumerable isPositiveList = list.Select (i => i > 0); foreach (bool isPositive in isPositiveList) { Console.WriteLine(isPositive); } Console.ReadKey(); }
实际上,Microsoft Research的Reactive Extensions框架确实添加了此功能.在System.Interactive
集会中,他们包括了一个Run()
和一个Do()
扩展IEnumerable
.
Do(action)将对每个元素执行操作并将其返回.这对于将记录添加到linq查询非常有用,例如:
var res = GetRandomNumbers(100).Take(10) .Do(x => Console.WriteLine("Source -> {0}", x)) .Where(x => x % 2 == 0) .Do(x => Console.WriteLine("Where -> {0}", x)) .OrderBy(x => x) .Do(x => Console.WriteLine("OrderBy -> {0}", x)) .Select(x => x + 1) .Do(x => Console.WriteLine("Select -> {0}", x));
这将导致:
Source -> 96 Where -> 96 Source -> 25 Source -> 8 Where -> 8 Source -> 79 Source -> 25 Source -> 3 Source -> 36 Where -> 36 Source -> 51 Source -> 53 Source -> 81 OrderBy -> 8 Select -> 9 9 OrderBy -> 36 Select -> 37 37 OrderBy -> 96 Select -> 97 97
运行(动作)就像一个foreach循环,这意味着它折叠执行动作的序列.
你可以在这里阅读更多相关信息:http://community.bartdesmet.net/blogs/bart/archive/2009/12/26/more-linq-with-system-interactive-the-ultimate-imperative.aspx
Rx框架可以在这里找到:http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx