使用列表处理失败的项目

本文关键字:项目 失败 表处理 列表 | 更新日期: 2023-09-27 17:54:49

如果能在处理列表中的每一项时都能速记就太好了,在这种情况下可以节省。

SO代替

var people = MakePeople();
foreach (var person in people)
{
    session.Save(person);
}

我们可以用

var cards = MakeCards(deck);
cards.Select(session.Save);

但是,这不起作用…建议吗?总吗?

使用列表处理失败的项目

Select使用惰性求值,因此无法工作。

您正在寻找List<T>.ForEach,或者它不存在的LINQ版本。

看起来Save()没有返回值。要对Select()使用该方法,它需要有一个返回值。

一般来说,将LINQ与有副作用的方法(如Save())一起使用是一个坏主意。当有副作用时,第一种方法当然是首选。如果MakePeople返回一个具体的List,您还可以尝试:
var people = MakePeople();
people.ForEach((p) => { session.Save(p); }); 

List有一个ForEach(Action<T> action)方法

您尝试创建一个Card -> Void映射。Select意味着将一个项目转换为另一种类型,这样您就可以将卡片收集转换为例如卡号收集。正如其他人已经提到的,List有一个ForEach重载。但是c#语言设计者的总体主题(参见Eric lippert的博客)是不提供这样的扩展方法,因为foreach更清晰。它不能保证你大量的打字,所以这里的好处是最小的。作为参考,你可以用3行代码创建一个这样的扩展方法。

public static void ForEach<T>(this IEnumerable<T> sequence, Action<T> action)
{ // argument null checking omitted
  foreach(T item in sequence) action(item);
}

吹毛求疵的角落:我的意思是(至少有一个有影响力的)c#语言设计者不想引入这个扩展方法。一旦它存在于BCL中,它就可以被任何。net语言使用。

你的,阿洛伊斯•克劳斯