C# 通过选择<&燃气轮机;一种方法

C# 通过选择<&燃气轮机;一种方法,c#,linq,C#,Linq,我有密码 Enumerable.Range(100, 100) .Select(x => x / 10) 是否有一种方法可以传递该行。选择(x=>x/10)到一个方法。其目的是在选择发生时将结果传递给方法。我想在这里避免使用foreach。如果您指的是推送模式,您可以使用: .Select(x => MyMethod(x / 10)) 您可以编写自己的扩展方法,在每个项通过时对其执行操作: public static IEnumerable<T>

我有密码

Enumerable.Range(100, 100)
          .Select(x => x / 10)

是否有一种方法可以传递该行。选择(x=>x/10)到一个方法。其目的是在选择发生时将结果传递给方法。我想在这里避免使用foreach。

如果您指的是推送模式,您可以使用:

 .Select(x => MyMethod(x / 10))

您可以编写自己的扩展方法,在每个项通过时对其执行操作:

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

这使它独立于
Select
本身。如果您需要它来利用投影,您可以编写如下内容:

public static IEnumerable<TResult> SelectAndAct<TSource, TResult>
    (this IEnumerable<TSource> source,
     Func<TSource, TResult> projection,
     Action<TSource, TResult> action)
{
    foreach (TSource item in source)
    {
        TResult result = projection(item);
        action(item, result);
        yield return result;
    }
}
请注意,所有这些都违反了LINQ无副作用的正常意图。在查询中产生副作用通常不是一个好主意。。。当然,每一条规则都有例外:)

如果您不想使用这些结果,您确实应该使用foreach:

foreach (var x in Enumerable.Range(100, 100))
{
    foo(x / 10);
}

我不确定,你想要什么,但是你不能用委托来传递它吗?MyMethod返回一个void更新:(哦,那条评论说‘假设MyMethod不返回void’)我删除了我的评论,因为我想除了做它想做的事情之外,你还可以创建一个返回其参数的方法。这就是我的答案的基本功能。当我使用您的方法时,会出现一个错误。无法从用法中推断方法“System.Linq.Enumerable.Select(System.Collections.Generic.IEnumerable,System.Func)”的类型参数。请尝试显式指定类型参数。@Bob:看Marcelo的答案。相同的想法,但更易于编译。乔恩:任何像亨克·霍特曼建议的简单方法。他的解决方案唯一的问题是我的方法返回一个空值。我的头在旋转,因为@Bob:这些很容易使用-参见示例。尽管如此,你还是应该试着理解泛型——它们会让你更容易浏览其他文档等。@Bob——看起来你应该小心你的要求,你可能会得到一个答案……@Bob:foo是你的方法调用。因为你没有一个名为
foo
的函数。它只是你想调用的代码的占位符。只需再查询一次。有没有办法删除“return r”。Foo是一个静态的void方法。对不起,我不明白。你不想要结果吗?如果不是,为什么要避免foreach?这将是一个更好的选择。此外,我并不是建议您创建一个名为
Foo
的函数。正如我所说,它只是一个占位符。您可以简单地用希望在每次迭代中运行的任何代码替换
foo(r)
。如果您碰巧已经有了一个可以执行您想要的操作的函数,那么只需调用它,而不是调用
foo
public static IEnumerable<TResult> SelectAndAct<TSource, TResult>
    (this IEnumerable<TSource> source,
     Func<TSource, TResult> projection,
     Action<TSource, TResult> action)
{
    foreach (TSource item in source)
    {
        TResult result = projection(item);
        action(item, result);
        yield return result;
    }
}
Enumerable.Range(100, 100)
          .SelectAndAct(x => x / 10,
                        (x, y) => Console.WriteLine("Was: {0}; Now: {1}", x, y))
Enumerable.Range(100, 100)
          .Select(x => { var r = x / 10; foo(r); return r; })
foreach (var x in Enumerable.Range(100, 100))
{
    foo(x / 10);
}