如何更改 C# 中 Directory.EnumerateFiles 的惰性结果

问题描述 投票:0回答:1

我需要更改 C# 中 Directory.EnumerateFiles 的惰性结果

我尝试了下面的代码,但我失去了 Directory.EnumerateFiles 函数的懒惰行为。

public Task<IEnumerable<string>> EnumerateStorageFiles(string DirectoryPathOnStorage, string SearchPattern = "*.*")
  {
      try
      {

          List<string> result = Directory.EnumerateFiles(GetStorageRelatedPath(DirectoryPathOnStorage),
                                                          SearchPattern,
                                                          new EnumerationOptions()
                                                          {
                                                              IgnoreInaccessible = true,
                                                              RecurseSubdirectories = true,
                                                              AttributesToSkip = FileAttributes.System,
                                                              ReturnSpecialDirectories = false
                                                          }).ToList();


          for (int i = 0; i < result.Count; i++)
          {
              result[i] = Path.GetRelativePath(StorageBasePath, result[i]);
          }

          return Task.FromResult(result.AsEnumerable());

      }
      catch { }

      return Task.FromResult(Enumerable.Empty<string>());
  }
c# async-await lazy-loading ienumerable
1个回答
0
投票
public Task<IEnumerable<string>> EnumerateStorageFiles(string DirectoryPathOnStorage, string SearchPattern = "*.*") 
    {
        try
        {
            // Using Select to transform paths lazily without converting to List
            IEnumerable<string> result = Directory.EnumerateFiles(GetStorageRelatedPath(DirectoryPathOnStorage),
                                                                  SearchPattern,
                                                                  new EnumerationOptions()
                                                                  {
                                                                      IgnoreInaccessible = true,
                                                                      RecurseSubdirectories = true,
                                                                      AttributesToSkip = FileAttributes.System,
                                                                      ReturnSpecialDirectories = false
                                                                  })
                                                  .Select(file => Path.GetRelativePath(StorageBasePath, file));
    
            return Task.FromResult(result);
        }
        catch
        {
            return Task.FromResult(Enumerable.Empty<string>());
        }
    }

您在代码中失去惰性行为的原因是由于 Directory.EnumerateFiles 上的 .ToList() 调用。当您调用 .ToList() 时,它会立即强制进行枚举,这意味着所有文件都会立即加载到内存中,从而违背了延迟计算的目的。

为了在转换结果时保持惰性求值,您可以避免转换为列表。

相反,您可以使用 LINQ 延迟应用转换,同时保留 IEnumerable 行为。

© www.soinside.com 2019 - 2024. All rights reserved.