4

この 1 ステートメントのクエリは、「ファイルが特定のファイル構造を含む ZIP リポジトリである裸のファイル名のリストを教えてください」ときちんと述べています。

しかし、私は .Where() 拡張メソッド (流暢な構文) と選択クエリの両方を使用しています。".Where(file ==> <statement>)" を "where <statement>" に変更すると、匿名メソッド コードが bool を返さないというエラーが発生し、"select <clause>" を変更すると、 ".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();
4

3 に答える 3

3

この式で使用しているすべての型を持っているわけではないので、コンパイルするのは非常に困難ですが、次のように作業する必要があると思います:

            return (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(zip.Any(e=> !e.IsDirectory && e.FileName.StartsWith(fruPath))
                                    .Any())
                            {
                                return false;
                            }
                        }
                        return true;
                    }
                } catch (Exception)
                {
                    return false;
                }
            }).Select(Path.GetFileNameWithoutExtension).ToArray());
于 2013-10-22T20:07:59.490 に答える
1

の使用を to に変更するだけでなくselect、最初Select(file =>に を削除する必要がありますfrom file inselect次に、そのクエリ構文句の使用を削除する必要があります。fromあなたが見ていたエラーを引き起こしたのは、その唯一の句でした。各from [...] in句には、一致する が必要selectです。

于 2013-10-22T20:08:52.207 に答える
0

クエリまたは流暢な構文のいずれかで満足していますが、どちらか一方に落ち着きたいと考えています。なぜこれが機能しないのか、一貫した構文に落ち着くために何をする必要があるのか​​ を誰かが説明できますか?

LINQ は、複雑なロジックの大きなブロックを条件として処理するように実際には作成されていないため、うまく機能していません。特に、LINQ 式構文は、(ブロックではなく) 式を提供することを前提としているため、複数行のステートメントを直接サポートしていません。

クエリの一部を削除するだけで、 ISun がその方法を示しているようにfrom、メソッド構文を簡単に機能させることができます。

一方、@Servy がコメントで示唆しているように、匿名メソッドを単純に抽出すると、コードはより理解しやすくモジュール化されます。その場合、あなたはどちらかと言うことを決めることができますwhere FileHasMatchingZipStructure(file). または.Where(FileHasMatchingZipStructure)、お好みで。

于 2013-10-22T20:44:21.400 に答える