是否有类似于IList的ForEach方法?
是否有类似于IList的ForEach方法?
可能是重复问题:
List
有一个叫做ForEach
的方法,它可以对其中的每个元素执行传入的操作。
var names = new List{ "Bruce", "Alfred", "Tim", "Richard" }; names.ForEach(p => { Console.WriteLine(p); });
但是如果names
不是一个List
而是一个IList
呢?IList
没有像ForEach
这样的方法。
是否有其他的替代方法呢?
有时候,我们想要在一个实现了IList接口的集合上执行一个操作,类似于List
首先,我们需要下载List
下面是一个示例扩展方法的代码:
public static void ForEach(this IList list, Action action) { if (list == null) throw new ArgumentNullException("null"); if (action == null) throw new ArgumentNullException("action"); for (int i = 0; i < list.Count; i++) { action(list[i]); } }
这个扩展方法稍微比使用foreach语句的实现方法更好,因为它利用了IList接口包含的索引器。
虽然我同意O. R. Mapper的答案,他认为使用foreach语句更清晰明了。但是在大型项目中,很难说服每个开发人员都采用这种方式。更糟糕的是,如果你的API是基于接口(IList)而不是具体类型(List)构建的,那么习惯于使用List
通过扩展方法,我们可以在实现了IList接口的集合上使用类似于List
有人提出了一个问题,是否有一种类似于`ForEach`的方法可以用于`IList`接口。原因可能是希望在`IList`上执行类似于`ForEach`的操作,而不仅仅是在`List`上可用。
解决方法是创建一个扩展方法,该方法接受一个`Action`委托作为参数,并在`IList`的每个元素上执行该操作。以下是一个示例扩展方法的代码:
public static void ForEach(this IList list, Action action) { foreach (T t in list) action(t); }
这样,就可以在`IList`上调用`ForEach`方法来执行指定的操作。
此外,还提供了一个使用LINQ的示例,其中使用了`Where`和`Select`方法来过滤和转换集合中的元素,然后使用`ForEach`方法对结果集执行操作。以下是示例代码:
people.Where(p => p.Tenure > 5) .Select(p => p.Nationality) .ForEach(n => AssignCitizenShip(n);
如果希望在`IEnumerable`上执行类似的操作,也可以创建一个扩展方法。以下是一个示例扩展方法的代码:
public static IEnumerableForEach (this IEnumerable list, Action action) { foreach (T t in list) { action(t); yield return t; } }
该方法将延迟执行操作,并返回一个`IEnumerable
虽然存在一些关于在`IEnumerable`上使用类似于`ForEach`的操作的争议,但这只是个人偏好的问题。一些人认为在`IEnumerable`上执行操作违反了函数式编程原则,而另一些人则认为它是一种简洁和清晰的写法。无论如何,可以根据个人偏好和具体情况来选择是否使用这种操作。