7

我有下面的代码,我期待不同的结果。
我排除了以下结果:100 ,110 ,120 , 200, 500

  using System;
  using System.Collections.Generic;
  using System.Linq;

  namespace ConsoleApplication11
  {
    public class Program
    {
      static void Main(string[] args)
      {
        var values = new List<int> { 100, 110, 120, 200 , 500 };

        //  In my mind the result shall be like (100,0) => 100 + 0 = 100 
        //  In my mind the result shall be like (110,0) => 110 + 0 = 110 etc. 
        var sumLinqFunction = new Func<int, int, int>((x, y) => x + y);
        var outputs = values.Select(sumLinqFunction);

        foreach (var o in outputs)
          Console.WriteLine(o);
      }
    }
  }

控制台输出(实际结果)

100
111
122
203
504

我现在想知道这个+1是从哪里来的?

4

5 回答 5

17

那是因为您使用的Select()方法重载的第二个参数只是输入集中项目的索引。

编辑:

正如@user7116 所建议的,您可能只想在投影函数中包含一个来自外部范围的值:

int y = 0;
var results = values.Select(x => x + y);
于 2013-09-17T14:21:37.540 回答
7

您的Func, sumLinqFunction, 需要两个参数,将它们相加,然后返回它们的结果。

当您在 Select 语句中使用它时,它就像:

var outputs = values.Select((x, y) => x + y);

它使用Select的重载,它期望第二个参数是索引。

selector 的第一个参数表示要处理的元素。 selector 的第二个参数表示源序列中该元素的从零开始的索引。例如,如果元素的顺序已知并且您想对特定索引处的元素执行某些操作,这将很有用。如果您想检索一个或多个元素的索引,它也很有用。

所以y0. 每次迭代时,索引 ( y) 都会移动到下一个元素,因此您会看到 的增量+1

为了更详细地解释它,您可以修改您的Func以显示当前值,x例如y

var sumLinqFunction = new Func<int, int, int>((x, y) =>
    {
        Console.WriteLine("x: {0} , y: {1}", x, y);
        return x + y;
    });
var outputs = values.Select(sumLinqFunction).ToList(); //iterate to get the results.

这会给你:

x: 100 , y: 0
x: 110 , y: 1
x: 120 , y: 2
x: 200 , y: 3
x: 500 , y: 4

对于您的评论:

我需要使用默认值 0 而不是索引来调用选择!

然后,Func您可以简单地执行以下操作,而不是 a:

int y = 0;
var outputs = values.Select(r => r + y);
于 2013-09-17T14:26:25.587 回答
4

检查您正在调用的 Select 重载的定义:

http://msdn.microsoft.com/en-us/library/bb534869.aspx

在这种情况下,您正在调用此重载:

public static IEnumerable<TResult> Select<TSource, TResult>(
    this IEnumerable<TSource> source,
    Func<TSource, int, TResult> selector
)

其中选择器是(强调我的)

应用于每个源元素的变换函数;函数的第二个参数表示源元素的索引

因此,您的选择器 lambda 将返回当前数组索引处的数字加上数组索引,因此

(x, y) => x + y

(100,0) => 100+0

(110,1) =>110+1

(120,2) =>120+2

(200,3) =>200+3

(500,4) =>500+4

于 2013-09-17T14:26:41.797 回答
4

您使用了错误的Select重载。

它只是将索引添加到当前值:

100 + 0
110 + 1
120 + 2
200 + 3
500 + 4

您不需要查询预期的输出。

var values = new List<int> { 100, 110, 120, 200 , 500 };

foreach (var o in outputs)
      Console.WriteLine(o);
于 2013-09-17T14:22:54.863 回答
1

如果您想使用一些具有“默认”参数值的函数:

    var values = new List<int> { 100, 110, 120, 200 , 500 };

    var sumLinqFunction = new Func<int, int, int>((x, y) => x + y);
    var outputs = values.Select(i => sumLinqFunction(i, 0));
于 2013-09-17T14:30:43.830 回答