c# - C# LINQ 结果的差异

标签 c# .net

当我这样做时:

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 被填充。

有没有人能很好地回答为什么一个有效而另一个无效?

最佳答案

注意:我假设 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/

相关文章:

c# - 通用类型作为变量

c# - 在多线程场景中正确锁定 List<T>?

.net - 我可以使用 EF Code First 和 .net core 生成迁移脚本吗

c# - 在 null IEnumerables 上为 Count() 返回零

c# - 字符串 EndsWith 方法中 Entity Framework Linq 中的奇怪行为

c# - Linq 表达式。帮助最小化代码

c# - 使用 LINQ 从 xml 创建实体对象的最佳方法

c# - 使用 Mono 针对 .NET Framework 4.0 进行定位和编译

c# - 获取保存的文件路径,无需任何回发

c# - 使用 linq 将重复项分组并计数到字典中