[英]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的重載,該重載期望第二個參數為索引。
選擇器的第一個參數表示要處理的元素。 選擇器的第二個參數表示源序列中該元素的從零開始的索引。 例如,如果元素以已知順序排列並且您想對特定索引處的元素進行某些操作,則這將很有用。 如果要檢索一個或多個元素的索引,它也很有用。
所以y
從0
開始。 每次迭代,索引( 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而不是索引來調用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.