Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么在lambda表达式中调用委托函数时会保留参数i?_C#_Linq_Lambda - Fatal编程技术网

C# 为什么在lambda表达式中调用委托函数时会保留参数i?

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

我有以下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={“一”、“二”、“三”、“三”、“三”};

string[]newArray=arrayOne.Where((string n,int i)=>{return i++有两个覆盖linq
Where

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" }