C# 为什么在lambda表达式中调用委托函数时会保留参数i?
我有以下C#代码,我发现参数C# 为什么在lambda表达式中调用委托函数时会保留参数i?,c#,linq,lambda,C#,Linq,Lambda,我有以下C#代码,我发现参数I的值被带入lambda表达式委托的下一个调用 string[] arrayOne = {"One", "Two", "Three", "Three", "Three"}; string[] newArray = arrayOne.Where ((string n, int i)=> {return i++ <=2;} ).ToArray(); // newArray is {"One","Two", "Three"} string[]arrayOne
I
的值被带入lambda表达式委托的下一个调用
string[] arrayOne = {"One", "Two", "Three", "Three", "Three"};
string[] newArray = arrayOne.Where ((string n, int i)=> {return i++ <=2;} ).ToArray();
// newArray is {"One","Two", "Three"}
string[]arrayOne={“一”、“二”、“三”、“三”、“三”};
string[]newArray=arrayOne.Where((string n,int i)=>{return i++有两个覆盖linqWhere
public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, int, bool> predicate);
public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);
这将返回集合中索引值小于或等于2的值
Where ((string n, int i)=> {return i++ <=2;})
其中((字符串n,int i)=>{return i++
我的期望是每次调用委托时都会传递一个新参数。我知道lambda表达式中使用的局部变量由于闭包而在所有调用中都会保留,但这是一个参数
调用之间不保留该参数。但是,第二个参数(inti
)是一个索引,因此它由中的逻辑递增。其中(…)
函数本身
在中,其中
看起来或多或少像:
public static IEnumerable<T> Where(this IEnumerable<T> data, Funct<T, int, bool> p) {
int i = 0;
foreach(T t in data) {
if(p(t, i)) {
yield return t;
}
i++;
}
}
在这里,我们用2
增加i
,我们看到确实小于2
的索引(或者增加2的索引小于4
)仍然是相同的。因此索引不会产生两个或三个跃点。不是。每次i
都是另一个,但由于它是一个索引,因此它无论如何都会递增。如果您使用+=2
,那么您将看到i
每次都是不同的。在第一次调用i
中,第二次i
是1,第三个i
是2,所以在前三个i>2
之后。无论是否更新i
,都没有影响。好的。明白了。谢谢。运算符i++
对下一次调用的i值没有影响,即使在比较操作之后,在代理的每次调用中'i'都会递增。i
仅被视为方法参数。
public static IEnumerable<T> Where(this IEnumerable<T> data, Funct<T, int, bool> p) {
int i = 0;
foreach(T t in data) {
if(p(t, i)) {
yield return t;
}
i++;
}
}
csharp> arrayOne.Where ((string n, int i)=> {i += 2; return i <= 4;} )
{ "One", "Two", "Three" }