我想用LINQ代替foreach,但它不工作

本文关键字:工作 foreach LINQ 代替 | 更新日期: 2023-09-27 18:09:38

在以下代码中,foreach循环工作良好,但当我尝试使用LINQ而不是使用foreach时,它不工作,没有例外,没有错误。

代码正常运行:

    public static IEnumerable<PatternInfo> LoadPatterns() {
        var directoryInfo = new DirectoryInfo(PatternFullPath);
        var dirs = directoryInfo.EnumerateDirectories();
        var result = new List<PatternInfo>();
        foreach (var info in dirs)
        {
            result.Add(new PatternInfo
                           {
                               PatternName = info.Name,
                               TemplateFileNames = GetTemplateFiles(info.FullName)
                           });
        }
        return result;
    }

但这个不是:

    public static IEnumerable<PatternInfo> LoadPatterns() {
        var directoryInfo = new DirectoryInfo(PatternFullPath);
        var dirs = directoryInfo.EnumerateDirectories();
        var patterns = dirs.Select(info => new PatternInfo {
            PatternName = info.Name,
            TemplateFileNames = GetTemplateFiles(info.FullName)
        });
        return patterns;
    }

我想用LINQ代替foreach,但它不工作

两者之间的区别在于,在第一个代码示例中,您有一个List<PatternInfo>,列表中的所有项都已填充-然后您将此列表返回为IEnumerable<PatternInfo>

在第二个例子中,你有一个IEnumerable<PatternInfo> -这只会在你第一次迭代枚举时加载模式。

如果您希望第二个版本相同(模式的即时加载),则添加ToList():

return patterns.ToList();

可枚举对象是懒惰的,除非有人开始枚举它们,所以:

foreach (var item in LoadPatterns())
{
    ...
}

第二个示例中的.Select语句只是返回一个新的IEnumerable<T>,但是直到有一些代码在这个可枚举对象上使用/循环之前,实际上什么都不会执行。

LINQ被延迟执行。您正在返回语句,但是直到您对返回的IEnumerable进行迭代之前,它不会得到评估。调用LoadPatterns()的代码是什么?