是否有类似于IList的ForEach方法?

24 浏览
0 Comments

是否有类似于IList的ForEach方法?

可能是重复问题:

LINQ中针对IEnumerable的等价方法

List有一个叫做ForEach的方法,它可以对其中的每个元素执行传入的操作。

var names = new List{ "Bruce", "Alfred", "Tim", "Richard" };
names.ForEach(p =>  { Console.WriteLine(p); });

但是如果names不是一个List而是一个IList呢?IList没有像ForEach这样的方法。

是否有其他的替代方法呢?

0
0 Comments

有时候,我们想要在一个实现了IList接口的集合上执行一个操作,类似于List的ForEach方法,但是IList接口并没有提供这样的方法。在这种情况下,我们可以自己创建一个扩展方法来实现这个功能。

首先,我们需要下载List的源代码,可以从Shared Source Initiative网站上获取。然后,我们可以在扩展方法中使用List的ForEach方法的大部分实现代码。

下面是一个示例扩展方法的代码:

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的ForEach方法的开发人员可能会在你的IList引用上调用ToList方法!我知道这是因为在我之前的项目中就发生过这种情况。我在我们的公共API中到处使用集合接口,遵循Framework Design Guidelines。过了一段时间,我才注意到许多开发人员不习惯这样做,开始大量出现对ToList方法的调用。最后,我将这个扩展方法添加到了一个共享的程序集中,确保所有不必要的ToList调用都从代码库中移除了。

通过扩展方法,我们可以在实现了IList接口的集合上使用类似于List的ForEach方法的功能,避免了在大型项目中对开发人员的约束和代码的不必要修改。

0
0 Comments

有人提出了一个问题,是否有一种类似于`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 IEnumerable ForEach(this IEnumerable list, Action action)
{
    foreach (T t in list)
    {
        action(t);
        yield return t;
    }
}

该方法将延迟执行操作,并返回一个`IEnumerable`对象。

虽然存在一些关于在`IEnumerable`上使用类似于`ForEach`的操作的争议,但这只是个人偏好的问题。一些人认为在`IEnumerable`上执行操作违反了函数式编程原则,而另一些人则认为它是一种简洁和清晰的写法。无论如何,可以根据个人偏好和具体情况来选择是否使用这种操作。

0
0 Comments

有人问是否有类似于IList的ForEach方法的解决方法。

问题的出现原因是因为List是一个常用的数据结构,经常需要对它进行遍历操作。尽管可以使用foreach循环来遍历List,但有人希望有一个类似于ForEach的方法,以便更加简洁和直观地对List进行遍历操作。

解决方法是使用foreach循环来遍历List,如下所示:

foreach (var p in names) {
    Console.WriteLine(p);
}

这种方法不需要使用委托和扩展方法,能够清晰地告诉读者正在做什么,与ForEach方法相比并没有任何不足之处。

0