【发布时间】:2020-11-27 23:22:01
【问题描述】:
我有一个方法可以从目录中读取所有文件作为字符串,然后遍历这些文件以获取文件内容以及其他详细信息,并从中返回 IEnumerable<DataFiles> 对象,如下所示:
public IEnumerable<DataFiles> GetFiles(string path)
{
var listOfFiles = new List<string>();
try
{
var jsonDataFiles = Directory.GetFiles(path, "*.json", SearchOption.AllDirectories);
var textDataFiles = Directory.GetFiles(path, "*.txt", SearchOption.AllDirectories);
listOfFiles.AddRange(jsonDataFiles);
listOfFiles.AddRange(textDataFiles);
for (int i = 0; i < listOfFiles.Count; i++)
{
var cfgPath = listOfFiles[i];
if (!File.Exists(cfgPath)) { continue; }
var fileContent = File.ReadAllText(cfgPath);
var pieces = cfgPath.Split(System.IO.Path.DirectorySeparatorChar, StringSplitOptions.RemoveEmptyEntries);
var fileName = pieces[pieces.Length - 1];
var md5HashValue = GetMD5Hash(cfgPath);
// error on below line
yield return new DataFiles
{
FileName = fileName,
FileContent = fileContent,
MD5Hash = md5HashValue
};
}
}
catch (UnauthorizedAccessException ex)
{
// log error here
}
// error on below line
return null;
}
但不知何故,我在上述方法中的yield return new 行和return null 行出现编译错误。以下是我看到的错误:
Cannot yield a value in the body of a try block with a catch clause
Cannot return a value from an iterator. Use the yield return statement to return a value, or yield break to end the iteration.
如果上面的代码抛出异常,那么我想返回空的 IEnumerable<DataFiles> 对象,否则它应该返回正确的 IEnumerable<DataFiles> 对象`,其中包含数据。
我在这里做错了什么?有没有更好更干净的方法来编写上述方法,这样我就不必在方法结束时返回 null?
【问题讨论】:
-
如果你使用
yield,你应该可以省略return null;这一行。否则您是否根据错误消息尝试过yield break? -
但是如果抛出异常会发生什么?
-
你的迭代将停止......这是你想要的吗?
-
我更新了我的问题。我忘了添加那个细节。如果基本上抛出异常,我想返回空的
IEnumerable<DataFiles>对象,否则返回正确的IEnumerable<DataFiles>具有完整内容的对象。 -
那么不要使用yield,因为此时在计算枚举数之前不会抛出错误。我建议建立一个
List<DataFile>并返回它或null。它的使用yield在这里让你感到困惑。
标签: c# asp.net-core ienumerable