通过Select<>一个方法

时间:2010-12-02 11:10:17

标签: c# linq

我有代码

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

有没有办法可以通过这条线。选择(x => x / 10)到一个方法。目的是在选择发生时将结果传递给方法。我想在这里避免使用foreach。

3 个答案:

答案 0 :(得分:5)

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

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

然后,根据您是想对原始值还是预期值进行操作,您需要写下:

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

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

这使它独立于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;
    }
}

然后:

Enumerable.Range(100, 100)
          .SelectAndAct(x => x / 10,
                        (x, y) => Console.WriteLine("Was: {0}; Now: {1}", x, y))

请注意,所有这些都违反了LINQ的正常意图,即无副作用。在查询中产生副作用通常不是 一个好主意...但当然每条规则都有例外情况:)

答案 1 :(得分:2)

如果您的意思是推模型,可以使用:

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

答案 2 :(得分:1)

Enumerable.Range(100, 100)
          .Select(x => { var r = x / 10; foo(r); return r; })

如果你不想消费结果,你真的应该使用foreach:

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