当我这样做时:

currentPage = metadataResponse.ApplicationType.Pages.Find(
   page => page.SortOrder == ++currentPage.SortOrder);
currentPage的值为空。

但是同样的逻辑,当我将增量值分配给整数变量,然后尝试获取currentPage
int sortOrder = ++currentPage.SortOrder;
currentPage = metadataResponse.ApplicationType.Pages.Find(
    page => page.SortOrder == sortOrder);

填充currentPage

有人对为什么一个有效而另一个不起作用有一个很好的答案吗?

最佳答案

注意:我假设Find方法应用于值的集合。

在第一个代码示例中,您将为集合中的每个元素增加currentPage(这是发生的,因为lambda表达式引入了对从外部作用域捕获的变量的闭包-有关此信息,请参见下面的代码块)。在第二个代码示例中,currentPage仅增加一次。看一下以下程序的行为:

class Program
{
    static void Main(string[] args)
    {
        Func1();
        Console.WriteLine("\n");
        Func2();

        Console.ReadKey();
    }

    private static void Func1()
    {
        int i = 0;
        var list = new List<int> { 1, 2, 3 };
        list.ForEach(x => Console.WriteLine(++i));
    }

    private static void Func2()
    {
        int i = 0;
        int j = ++i;
        var list = new List<int> { 1, 2, 3 };
        list.ForEach(x => Console.WriteLine(j));
    }
}

Here是有关lambda表达式中的闭包的更多信息。玩得开心! ;-)

关于c# - C#LINQ结果中的差异,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35235444/

10-11 11:24