C# “林克风格”;对于每一个“;

C# “林克风格”;对于每一个“;,c#,.net,linq,foreach,C#,.net,Linq,Foreach,“for each”操作是否有Linq风格的语法 例如,将基于一个集合的值添加到另一个已存在的集合: IEnumerable<int> someValues = new List<int>() { 1, 2, 3 }; IList<int> list = new List<int>(); someValues.ForEach(x => list.Add(x + 1)); 使用ToList()扩展方法是最好的选择: someValues.

“for each”操作是否有Linq风格的语法

例如,将基于一个集合的值添加到另一个已存在的集合:

IEnumerable<int> someValues = new List<int>() { 1, 2, 3 };

IList<int> list = new List<int>();

someValues.ForEach(x => list.Add(x + 1));
使用ToList()扩展方法是最好的选择:

someValues.ToList().ForEach(x => list.Add(x + 1));
BCL中没有直接实现ForEach的扩展方法


尽管BCL中没有扩展方法可以实现这一点,但是
系统
命名空间中仍然有一个选项。。。如果向项目中添加:

using System.Reactive.Linq;

someValues.ToObservable().Subscribe(x => list.Add(x + 1));

这与上面使用的
ToList
具有相同的最终结果,但(理论上)效率更高,因为它将值直接流式传输给代理。

标准Linq中没有类似的内容,但中有一个ForEach操作符。

和类已经有
ForEach
方法,虽然只有这个具体的实现。(顺便说一句,注意前者是静态的)

不确定它是否真的比
foreach
语句有很大的优势,但是您可以编写一个扩展方法来完成所有
IEnumerable
对象的工作

public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
{
    foreach (var item in source)
        action(item);
}
publicstaticvoidforeach(此IEnumerable源代码,Action)
{
foreach(源中的var项)
行动(项目);
}

这将允许您在问题中发布的确切代码按照您的意愿工作。

没有任何内置代码,但您可以轻松创建自己的扩展方法来完成此操作:

public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
{
    if (source == null) throw new ArgumentNullException("source");
    if (action == null) throw new ArgumentNullException("action");

    foreach (T item in source)
    {
        action(item);
    }
}
publicstaticvoidforeach(此IEnumerable源代码,Action)
{
如果(source==null)抛出新的ArgumentNullException(“source”);
如果(action==null)抛出新的ArgumentNullException(“action”);
foreach(源中的T项)
{
行动(项目);
}
}
官方MS行是“因为它不是功能性操作”(即有状态操作)

你不能做一些类似于:

list.Select( x => x+1 )
或者,如果您确实需要在列表中列出:

var someValues = new List<int>( list.Select( x => x+1 ) );
var someValues=新列表(List.Select(x=>x+1));

没有Linq ForEach扩展。但是,如果您愿意直接使用
List
,则
List
类上有一个ForEach方法

值得一提的是,标准的
foreach
语法将为您提供所需的结果,并且可能更易于阅读:

foreach (var x in someValues)
{
    list.Add(x + 1);
}
如果你坚持你想要一个Linq风格的扩展。自己实现这一点很简单

public static void ForEach<T>(this IEnumerable<T> @this, Action<T> action)
{
   foreach (var x in @this)
      action(x);
}
publicstaticvoidforeach(this IEnumerable@this,Action)
{
foreach(在@this中的变量x)
行动(x);
}

关于功能性操作和有状态操作,您有自己的观点。然而,F#被设计成一个函数长度,并且有一个等价的
ForEach
方法。你能为“官方MS行”提供一个参考吗?我对阅读他们其余的文章很感兴趣。我可能不应该用“官方”这个词,但这是我想到的博客:谢谢,很明显我可以自己写扩展。我只是想在做这件事之前尽量使用内置的东西。是的,这很公平。我还确保我没有重新发明BCL功能。在本例中,没有。Array类没有ForEach方法:),但在Microsoft.Practices.ObjectBuilder2命名空间中有一个“EnumerableExtensions”statşc类。它有IEnumerable的foreach方法:)请记住,这对于很长的列表并不理想,因为它在循环遍历整个列表之前会复制整个列表。调用
ToList
,然后调用
foreach
,需要在原始集合中迭代两次。我更喜欢一个标准的
foreach
循环:输入更少,可读性更强,性能更好:
foreach(某些值中的var x)列表。添加(x+1)对于任何看到这一点并认为这是一个好答案的人来说,它不是。这是疯狂的低效。关于做事的正确方法,请参见Noldorin的答案。所有观点都很公平,但我想补充一点:理论上它可能效率低下,但我处理的大多数内存列表往往只有不到12项。性能。问题通常出现在其他地方,所以我认为,明确地说这个答案不好是过早的优化。问题是这种语法是否可用,这与您在不亲自编写扩展方法的情况下使用普通的.NET3.5SP1非常接近。我希望在BCL中有一个ForEach扩展方法,但在当前的框架中不可用。@Luke:没有特别的好处,但这也不是问题所在。在任何情况下,我认为这是一场茶杯风暴:在大多数情况下,我打赌你根本感觉不到性能差异。另请参阅Eric Lippert的这篇博文,关于在BCL中不包含
ForEach
的理由:为什么没有内置任何东西?我错过什么了吗?这似乎是非常需要的基本功能,因为linq方法不应该有副作用
public static void ForEach<T>(this IEnumerable<T> @this, Action<T> action)
{
   foreach (var x in @this)
      action(x);
}