LINQ查询结果的调用方法简洁

时间:2010-06-20 16:56:23

标签: linq

我想从LINQ查询中调用每个对象的MyMethod,这样做的最佳方法是什么?

目前我正在使用:

.Select(x => { x.MyMethod (); return x; }).ToArray();

立即执行需要ToArray()。

有没有更简单的方法来写这个(没有foreach)

由于

5 个答案:

答案 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();