這個單語句查詢很整潔地說:「給我一個文件名爲包含特定文件結構的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提取到方法中。 –