我有以下代码,我期待不同的结果 我排除了以下结果: 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来自何处?
答案 0 :(得分:17)
这是因为您使用的Select()方法重载的第二个参数只是输入集中项目的索引。
编辑:
正如@ user7116建议的那样,您可能只想在投影函数中包含来自外部范围的值:
int y = 0;
var results = values.Select(x => x + y);
答案 1 :(得分:7)
您的Func
,sumLinqFunction
期待两个参数,将它们相加,然后返回结果。
在Select语句中使用它时,它就像:
var outputs = values.Select((x, y) => x + y);
使用Select的重载,期望第二个参数是索引。
selector的第一个参数表示要处理的元素。 选择器的第二个参数表示源序列中该元素的从零开始的索引。如果 元素按照已知的顺序,你想用一个 例如,特定索引处的元素。它也可能有用 你想要检索一个或多个元素的索引。
所以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);
答案 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));