想要使用LINQ而不是foreach但它不起作用

时间:2011-09-26 21:28:48

标签: c# .net linq loops

在下面的代码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;
    }

任何建议都会有所帮助。

3 个答案:

答案 0 :(得分:6)

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

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

如果您希望第二个版本相同(急切加载模式),请添加ToList()

return patterns.ToList();

答案 1 :(得分:2)

嗯,在有人开始枚举它们之前,可枚举是懒惰的,所以:

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

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

答案 2 :(得分:1)

LINQ是延迟执行。您将返回该语句,但在您执行某些操作以迭代您返回的IEnumerable之前,它不会被评估。调用LoadPatterns()的代码是什么?