我需要更改 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>());
}
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 行为。