【发布时间】:2021-12-04 15:33:17
【问题描述】:
我查看了 List.ForEach(Action action) 方法的文档,但它只说明了它的作用,而不是它的作用。我知道它会采取行动并对列表的所有元素执行该行动。但是它用来完成此操作的实际代码是什么?有没有一种方法可以让我自己的 ForEach 方法与列表 ForEach 方法的工作方式相同?
过去我曾想压缩我的 ForEach 循环,这看起来在某些情况下效果很好,尤其是当我使用自定义类时。
【问题讨论】:
-
一个普通的
foreach语句接受一个IEnumerable(如果它是一个泛型集合,则为泛型版本)并在其上调用GetEnumerator,返回一个IEnumerator(可能是of T)。然后它使用枚举器遍历集合。List<T>.ForEach方法是一种扩展方法,它遍历列表(使用简单的foreach)并在列表的每个成员上调用给定的Action<T>。写起来很简单(只需在列表类上写一个扩展方法来完成我所描述的操作。那里没有魔法 -
@Flydog57 C# 还支持将
foreach与具有GetEnumerator()方法的任何对象 一起使用——类型不再需要实现IEnumerable。这样做是为了支持值类型集合,而无需对接口进行装箱。 stackoverflow.com/questions/21486382/… -
@dai:C# 还对非泛型集合进行了特殊处理,提供了一种进行类型安全枚举的方法,即使非泛型
IEnumerator方法仅适用于objects。这是在 v1.0 和 v1.1 时代(在 v2.0 中引入泛型之前)实现的,因此程序员不必在foreach循环中进行强制转换 -
@Flydog57 呃,与您建议的程度不同。
foreach语句仍然在 C# 7、8 中执行不安全强制转换,我认为 9 也是。