C# LINQ结果不一致

5
当我执行以下操作时:
currentPage = metadataResponse.ApplicationType.Pages.Find(
   page => page.SortOrder == ++currentPage.SortOrder);

currentPage 的值为 null。

但是,当我将增量值分配给一个整数变量,然后尝试获取 currentPage 时,相同的逻辑。

int sortOrder = ++currentPage.SortOrder;
currentPage = metadataResponse.ApplicationType.Pages.Find(
    page => page.SortOrder == sortOrder);

currentPage会被填充数据。

有人能够给出为什么一个代码可以运行而另一个不能的好答案吗?


5
它们不等同,就是这么简单。显然,Lambda表达式正在被多次评估(我不知道Find()方法是什么),并且会多次更改当前页面的排序顺序。 - Jeff Mercado
5
避免在查询中使用具有副作用的 lambda 表达式。 - Michael Liu
1个回答

6

注意:我假设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));
    }
}

这里是关于lambda表达式中闭包的更多信息。祝您愉快!;-)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接