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

简洁地调用LINQ查询结果的方法,linq,Linq,我想对LINQ查询中的每个对象调用MyMethod,最好的方法是什么 目前我正在使用: .Select(x => { x.MyMethod (); return x; }).ToArray(); 需要ToArray()立即执行 有没有更简单的方法来写这个(没有foreach) 谢谢我创建了一个应用扩展方法: public static IEnumerable<T> Apply<T>(this IEnumerable<T> source, Action&

我想对LINQ查询中的每个对象调用MyMethod,最好的方法是什么

目前我正在使用:

.Select(x => { x.MyMethod (); return x; }).ToArray();
需要ToArray()立即执行

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


谢谢

我创建了一个
应用
扩展方法:

public static IEnumerable<T> Apply<T>(this IEnumerable<T> source, Action<T> action)
{
    foreach(var item in source)
    {
        action(item);
        yield return item;
    }
}

实际上,这类似于
列表。ForEach
方法,只是它返回源的项,以便您可以继续对其应用序列运算符我创建了一个
应用
扩展方法:

public static IEnumerable<T> Apply<T>(this IEnumerable<T> source, Action<T> action)
{
    foreach(var item in source)
    {
        action(item);
        yield return item;
    }
}

实际上,这与列表类似。ForEach方法,只是它返回源代码的项目,以便您可以继续在其上应用序列运算符
你真的什么也得不到。

A for each可能是实现这一点的最简单的方法,你可以编写一个扩展方法来实现for each,但是
你真的什么也得不到。

你可以指定你自己的可重用扩展方法,在每个元素上运行一个
操作,并返回它

IEnumerable<T> Do(this IEnumerable<T> vals, Action<T> action) {
    foreach(T elem in vals) {
        action(elem);
        yield return elem;
    }
}

您可以指定自己的可重用扩展方法,在每个元素上运行
操作
,并返回它

IEnumerable<T> Do(this IEnumerable<T> vals, Action<T> action) {
    foreach(T elem in vals) {
        action(elem);
        yield return elem;
    }
}

xList已具有所需的方法:.ForEach()。它对每个列表成员调用一个操作

List<x> fooList = ....Select(x => x).ToList();
fooList.ForEach(x => DoSomething(x));
List傻瓜列表=..选择(x=>x).ToList();
傻瓜。ForEach(x=>DoSomething(x));

xList已具有所需的方法:.ForEach()。它对每个列表成员调用一个操作

List<x> fooList = ....Select(x => x).ToList();
fooList.ForEach(x => DoSomething(x));
List傻瓜列表=..选择(x=>x).ToList();
傻瓜。ForEach(x=>DoSomething(x));

在我看来,您不需要调用.to\uuuuuuuuuu转换方法,因为您只希望看到副作用。被动扩展的Do()方法将是一个可行的选择

通过使用Do()方法,您有两个优点(就我而言)

1) 延迟执行(如果需要,可以延迟立即执行)

2) Do()方法有不同的重载,让您对迭代有更多的控制。 例如:Do(onNext、OnError、onCompleted)重载


在我看来,您不需要调用.to____;转换方法,因为您只期望有副作用。被动扩展的Do()方法将是一个可行的选择

通过使用Do()方法,您有两个优点(就我而言)

1) 延迟执行(如果需要,可以延迟立即执行)

2) Do()方法有不同的重载,让您对迭代有更多的控制。 例如:Do(onNext、OnError、onCompleted)重载


Rx
还包括
Run
操作符,它与
Do
类似,但也执行序列(无需将其存储在数组中的开销)。
Rx
还包括
Run
操作符,它与
Do
类似,但也执行序列(无需将其存储在数组中的开销)。您可以简化它:
doulist.ForEach(DoSomething)
您可以简化它:
doulist.ForEach(DoSomething)