这个单语句查询很整洁地说:“给我一个文件名为包含特定文件结构的ZIP存储库的文件名列表。”如何使用一致的语法重写此LINQ表达式?
但我同时使用.Where()扩展方法(流畅的语法)和一个选择查询,因为我尝试其他任何事情都无法编译。如果我将“Where(文件==> <语句>)”更改为“<语句>”,则会出现匿名方法代码不会返回bool的错误,并且如果更改“选择<子句>”到“。选择(<子句>)”,错误是“没有使用select子句”。
我很高兴与查询或流利的语法,但我想解决一个或另一个。任何人都可以解释为什么这不起作用,我需要做什么来解决一个一致的语法?
return (from file in Directory.EnumerateFiles(
Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), Globals.CompanyName, ProjectName, FolderName),
imageExtension,
SearchOption.TopDirectoryOnly)
.Where(file =>
{
try
{
string relativePath = ClassFru.Station + "/"; // Inside ZIPs, paths use a single forward slash
var zip = new ZipFile();
zip.ZipError += (s, o) => { throw new Exception(); };
using (zip = ZipFile.Read(file))
{
/// <todo>if (zip.Comment != Globals.CompanyName) { return false; }</todo>
foreach (var fru in this.gFrus)
{
var fruPath = relativePath + fru.Id + '.';
if (!(from e in zip where !e.IsDirectory && e.FileName.StartsWith(fruPath) select true).Any()) { return false; }
}
return true;
}
}
catch (Exception)
{
return false;
}
})
select Path.GetFileNameWithoutExtension(file)).ToArray();
我认为这可能是其中几个'foreach'列举更容易理解的情况之一:) –
那个'Where'的内容几乎肯定不应该是一个匿名方法;这应该是一个命名方法,以便您可以编写像'.Where(DirectoryIsValid)'或类似的东西。 – Servy
你得到“不使用select子句”的原因是因为你也有'from'。将整个东西转换为方法语法,或者像Servy所说的那样将lambda提取到方法中。 –