Linq查询中的意外结果始终为+ 1

时间:2013-09-17 14:18:14

标签: c# linq

我有以下代码,我期待不同的结果 我排除了以下结果: 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来自何处?

5 个答案:

答案 0 :(得分:17)

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

编辑:

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

int y = 0;
var results = values.Select(x => x + y);

答案 1 :(得分:7)

您的FuncsumLinqFunction期待两个参数,将它们相加,然后返回结果。

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

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

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

  

selector的第一个参数表示要处理的元素。   选择器的第二个参数表示源序列中该元素的从零开始的索引。如果   元素按照已知的顺序,你想用一个   例如,特定索引处的元素。它也可能有用   你想要检索一个或多个元素的索引。

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

为了进一步说明,您可以修改Func以显示xy的当前值,如:

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调用select而不是索引!

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

int y = 0;
var outputs = values.Select(r => r + y);

答案 2 :(得分: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);

答案 3 :(得分: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返回当前数组索引处的数字PLUS数组索引,因此

(x,y)=&gt; x + y

(100,0)=&gt; 100 + 0

(110,1)=&gt; 110 + 1

(120,2)=&gt; 120 + 2

(200,3)=&gt; 200 + 3

(500,4)=&gt; 500 + 4

答案 4 :(得分:1)

如果您想使用某些带有'default'参数值的函数:

    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));