使用 Foreach 子句的 Lambda 表达式

发布于 2024-07-20 06:04:15 字数 1197 浏览 1 评论 0原文

可能的重复:
为什么没有 ForEach 扩展方法在 IEnumerable 接口上?

编辑

作为参考,这里是 eric 在评论中提到的博客文章

https://ericlippert.com/2009/05/18/foreach-vs-foreach/

ORIG

更多的是好奇我想但是 C# 规范专家的一个...

为什么 ForEach() 子句在 IQueryable/IEnumerable 结果集上不起作用(或不可用)...

您必须首先转换结果ToList() 或 ToArray() 与 C# 相比,C# 迭代 IEnumerables 的方式可能存在技术限制。 列表... 这与 IEnumerables/IQuerable 集合的延迟执行有关吗? 例如

var userAgentStrings = uasdc.UserAgentStrings
    .Where<UserAgentString>(p => p.DeviceID == 0 && 
                            !p.UserAgentString1.Contains("msie"));
//WORKS            
userAgentStrings.ToList().ForEach(uas => ProcessUserAgentString(uas));         

//WORKS
Array.ForEach(userAgentStrings.ToArray(), uas => ProcessUserAgentString(uas));

//Doesn't WORK
userAgentStrings.ForEach(uas => ProcessUserAgentString(uas));

Possible Duplicate:
Why is there not a ForEach extension method on the IEnumerable interface?

EDIT

For reference, here's the blog post which eric referred to in the comments

https://ericlippert.com/2009/05/18/foreach-vs-foreach/

ORIG

More of a curiosity I suppose but one for the C# Specification Savants...

Why is it that the ForEach() clause doesn't work (or isn't available) for use on IQueryable/IEnumerable result sets...

You have to first convert your results ToList() or ToArray()
Presumably theres a technical limitation to the way C# iterates IEnumerables Vs. Lists...
Is it something to do with the Deferred Execution's of IEnumerables/IQuerable Collections.
e.g.

var userAgentStrings = uasdc.UserAgentStrings
    .Where<UserAgentString>(p => p.DeviceID == 0 && 
                            !p.UserAgentString1.Contains("msie"));
//WORKS            
userAgentStrings.ToList().ForEach(uas => ProcessUserAgentString(uas));         

//WORKS
Array.ForEach(userAgentStrings.ToArray(), uas => ProcessUserAgentString(uas));

//Doesn't WORK
userAgentStrings.ForEach(uas => ProcessUserAgentString(uas));

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

寄风 2024-07-27 06:04:16

完全可以为 IEnumerable 编写 ForEach 扩展方法。

我不太确定为什么它不作为内置扩展方法包含在内:

  • 也许是因为 ForEach 已经存在于 ListArray< 上/code> 在 LINQ 之前。
  • 也许是因为使用 foreach 循环来迭代序列非常容易。
  • 也许是因为它的功能/LINQy 不够。
  • 也许是因为它不可链接。 (制作一个在执行操作后产生每个项目的可链接版本很容易,但这种行为并不是特别直观。)

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

It's perfectly possible to write a ForEach extension method for IEnumerable<T>.

I'm not really sure why it isn't included as a built-in extension method:

  • Maybe because ForEach already existed on List<T> and Array prior to LINQ.
  • Maybe because it's easy enough to use a foreach loop to iterate the sequence.
  • Maybe because it wasn't felt to be functional/LINQy enough.
  • Maybe because it isn't chainable. (It's easy enough to make a chainable version that yields each item after performing an action, but that behaviour isn't particularly intuitive.)

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);
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文