在IEnumerable上使用扩展方法的Foreach

Rez*_*eni 5 c# ienumerable foreach extension-methods

快速提问,请参阅此代码:

List<int> result = new List<int>();

var list = new List<int> { 1, 2, 3, 4 };

list.Select(value =>
    {
        result.Add(value);//Does not work??
        return value;
    });
Run Code Online (Sandbox Code Playgroud)

而且:

result.Count == 0 //true
Run Code Online (Sandbox Code Playgroud)

为什么result.Add(value)没有执行?

然而,这不执行,另一个问题是有办法做的foreach的IEnumerableExtention方法

除此之外: IEnumerable.ToList().Foreach(p=>...)

Ree*_*sey 17

为什么result.Add(value)没有执行?

这是因为LINQ使用延迟执行.在您实际枚举结果(返回Select)之前,代理将不会执行.

要演示,请尝试以下操作:

List<int> result = new List<int>();

var list = new List<int> { 1, 2, 3, 4 };

var results = list.Select(value =>
    {
        result.Add(value);//Does not work??
        return value;
    });

foreach(var item in results)
{
     // Just iterating through this will cause the above to execute...
}
Run Code Online (Sandbox Code Playgroud)

话虽如此,这是一个坏主意.如果可以避免LINQ查询,则不应该有副作用.您可以将其Select视为一种转换数据的方式,而不是执行代码.

但是这没有执行,另一个有问题的问题是使用扩展方法对IEnumerable进行预测吗?

你可以编写自己的扩展方法:

public static void ForEach<T>(this IEnumerable<T> items, Action<T> action)
{
    foreach(var item in items)
         action(item);
}
Run Code Online (Sandbox Code Playgroud)

但是,我建议不要这样做.有关详细信息,请参阅Eric Lippert关于此主题的帖子.