簡體   English   中英

Linq查詢中的意外結果總是+ 1

[英]Unexpected results in Linq query always + 1

我有以下代碼,並且期望得到不同的結果。
我已經例外的是以下的結果: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是從哪里來的?

這是因為您正在使用的Select()方法重載的第二個參數只是輸入集中項目的索引。

編輯:

正如@ user7116所建議的那樣,您可能希望在投影函數中簡單地包含外部范圍的值:

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

您的Func sumLinqFunction兩個參數,將它們加起來然后返回結果。

當您在Select語句中使用它時,它就像:

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

它使用Select的重載,該重載期望第二個參數為索引。

選擇器的第一個參數表示要處理的元素。 選擇器的第二個參數表示源序列中該元素的從零開始的索引。 例如,如果元素以已知順序排列並且您想對特定索引處的元素進行某些操作,則這將很有用。 如果要檢索一個或多個元素的索引,它也很有用。

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

您使用了錯誤的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);

檢查要調用的選擇重載的定義:

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

如果要使用帶有“默認”參數值的某些功能:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM