【问题标题】:Foreach with Extension Method on IEnumerable在 IEnumerable 上使用扩展方法的 Foreach
【发布时间】:2012-01-16 07:15:06
【问题描述】:

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

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;
    });

还有:

result.Count == 0 //true

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

但是这没有执行,另一个问题是有办法用 扩展方法 对 IEnumerable 执行 foreach 吗?

这种方式除外:IEnumerable.ToList().Foreach(p=&gt;...)

【问题讨论】:

  • @DJKRAZE 它已经是代表了。
  • 我在下面发布了我的代表示例以利用 list.ForEach
  • ForEach 不是扩展方法,也不是 LINQ。 ForEach 是 List&lt;T&gt; 上的一个方法。
  • 是的,但他正在使用 list.Select 何时可以使用 List.ForEach
  • 仅供参考 - 将来,我建议每个问题/帖子坚持一个问题......

标签: c# foreach extension-methods ienumerable


【解决方案1】:
List<int> result = new List<int>();
var list = new List<int> { 1, 2, 3, 4 };
list.ForEach(delegate(int sValue)
{
    result.Add(sValue);
});

这可行,但所有并将 1 2 3 4 添加到结果中。测试一下。我刚做了。

【讨论】:

  • 我提到:除了这种方式:IEnumerable.ToList().Foreach(p=>...)
【解决方案2】:

Select 是惰性的,并且会延迟执行,直到您开始枚举结果。例如,您需要通过调用 .ToArray 或遍历结果来使用结果集:

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

【讨论】:

  • 如果我要使用一种方法来强制枚举,我会选择具有恒定内存的方法,例如 Max() 而不是 ToArray()。
【解决方案3】:

为什么 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...
}

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

但是这没有执行,另一个问题是有办法在 IEnumerable 上使用扩展方法执行 foreach 吗?

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

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

但是,我建议不要这样做。详情请参考Eric Lippert's post on the subject。

【讨论】:

  • 感谢您的回答,您的描述解决了我对 IEnumerable 和延迟执行的理解困惑。
猜你喜欢
  • 1970-01-01
  • 2018-09-06
  • 2019-03-17
  • 2019-11-14
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
  • 2011-01-01
  • 1970-01-01
相关资源
最近更新 更多