我想从LINQ查询中调用每个对象的MyMethod,这样做的最佳方法是什么?
目前我正在使用:
.Select(x => { x.MyMethod (); return x; }).ToArray();
立即执行需要ToArray()。
有没有更简单的方法来写这个(没有foreach)
由于
答案 0 :(得分:5)
您可以指定自己的可重用扩展方法,在每个元素上运行Action<>
,并且yield返回它。
IEnumerable<T> Do(this IEnumerable<T> vals, Action<T> action) {
foreach(T elem in vals) {
action(elem);
yield return elem;
}
}
此类方法包含在System.Interactive
命名空间下的Rx library中。
然后你可以简单地做
myCollection.Do(x => x.MyMethod()).ToArray();
答案 1 :(得分:2)
xList已经有你需要的方法:.ForEach()。它在每个列表成员上调用一个Action。
List<x> fooList = ....Select(x => x).ToList();
fooList.ForEach(x => DoSomething(x));
答案 2 :(得分:1)
我创建了Apply
扩展方法:
public static IEnumerable<T> Apply<T>(this IEnumerable<T> source, Action<T> action)
{
foreach(var item in source)
{
action(item);
yield return item;
}
}
您可以按如下方式使用它:
var results = query.Apply(x => x.MyMethod()).ToArray();
实际上,这类似于List<T>.ForEach
方法,除了它返回源的项目以便您可以继续在其上应用序列运算符
答案 3 :(得分:1)
每个人的A可能是最简单的方法,你可以写一个扩展方法,为每个人做,但 你真的不会得到任何东西。
答案 4 :(得分:1)
在我看来,你不需要调用.To ___转换方法,因为你只期待副作用。 Reactive Extension的Do()方法将是一个可行的选择。
通过使用Do()方法,你有两个优点(据我所知),
1)推迟执行(如果需要,可以推迟立即执行)。
2)Do()方法有不同的重载,让你有更多的迭代控制。 例如:Do(onNext,OnError,OnCompeleted)重载
var deferQuery = query.Do(x => a.MyMethod(), ex => Console.WriteLine(ex.Message), () => Console.WriteLine("Completed"));
var immediateQuery = query.Do(x => a.MyMethod(), ex => Console.WriteLine(ex.Message), () => Console.WriteLine("Completed")).Run();