使用iList处理失败的项目

时间:2011-05-02 17:55:23

标签: c# linq generics

用速记处理列表中的每个项目会很棒,在这种情况下是保存。

SO intead of

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

我们可以使用

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

但是,这不起作用..建议?聚合

4 个答案:

答案 0 :(得分:2)

Select使用延迟评估,因此无效。

您正在寻找List<T>.ForEach或其non-existent LINQ version

答案 1 :(得分:1)

看起来Save()没有返回值。要将方法与Select()一起使用,它需要具有返回值。

一般来说,将LINQ与具有副作用的方法(如Save())一起使用是个坏主意。当有副作用时,第一种方法肯定是首选。如果MakePeople返回一个具体的List,你也可以尝试:

var people = MakePeople();
people.ForEach((p) => { session.Save(p); }); 

答案 2 :(得分:0)

答案 3 :(得分:0)

你试图创建一张卡片 - &gt;无效映射。选择是为了将一个项目转换为另一个类型,因此您可以将卡片集合转换为例如一个cardnumber集合。 正如其他人已经提到的那样,List有一个ForEach超载。但是C#语言设计者的一般主题(见Eric Lipperts blog)是不提供这样的扩展方法,因为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);
}

Nitpick Corner:我的意思和写作(至少有一个影响力)C#语言设计师不想引入这种扩展方法。一旦它存在于BCL中,它就可以被任何.NET语言使用。

此致,   Alois Kraus