-4

for each が使用されている小さなコードがあります。コードを最適化しましたが、上司はさらに最適化することを期待しています。ここでさらにどのような最適化を行うことができるかわかりません。

foreach (Match match in matches) {
    //When oveeride is false and you have to download all the files
    if (Override.Equals(false)) {
        //putting the matches from regular expression into DownloadFileStruct oject
        df = new DownloadFileStruct(match.Groups[1].Value, match.Groups[2].Value);

        //Adding DownloadFileStruct object to a array list
        DownloadFileList.Add(df);
    }

    //When override is true and a paticular file has to be downloaded
    else if (match.Groups[2].Value.Equals(OverrideFileName)) {
            //putting the matche from regular expression into a DownloadFileStruct oject
            df = new DownloadFileStruct(match.Groups[1].Value, match.Groups[2].Value);

            //Adding DownloadFileStruct object to a array list
            DownloadFileList.Add(df);
        }                   
    }               
}

私の上司は、「両方のブランチで同じコードを実行する 'if' と 'else if' は必要ありません」と言っています。

4

4 に答える 4

5

コードを 2 回繰り返す代わりに、if で OR を使用するだけです。

最適化ではなく、まったく同じことを行う 2 つのコード ブランチを維持する必要がないということです。

foreach (Match match in matches) {
    //When oveeride is false and you have to download all the files
    if (Override.Equals(false) || match.Groups[2].Value.Equals(OverrideFileName)) {
        //putting the matches from regular expression into DownloadFileStruct oject
        df = new DownloadFileStruct(match.Groups[1].Value, match.Groups[2].Value);

        //Adding DownloadFileStruct object to a array list
        DownloadFileList.Add(df);
    }                     
}
于 2013-10-22T15:16:52.867 に答える
5

コードを次のように簡略化できます。

foreach (Match match in matches)
{
    if (Override && !match.Groups[2].Value.Equals(OverrideFileName))
        continue;

    df = new DownloadFileStruct(match.Groups[1].Value, match.Groups[2].Value);
    DownloadFileList.Add(df);
}

またはLINQっぽい:

DownloadFileList = 
    matches.Cast<Match>()
           .Where(x => !Override || x.Groups[2].Value.Equals(OverrideFileName))
           .Select(x => new DownloadFileStruct(x.Groups[1].Value,
                                               x.Groups[2].Value))
           .ToList();
于 2013-10-22T15:17:30.260 に答える
4

それは実際には最適化ではありませんが、コード次のように単純になります。

if (!Override || match.Groups[2].Value == OverrideFileName)
{
    var df = new DownloadFileStruct(match.Groups[1].Value,
                                    match.Groups[2].Value);
    DownloadFileList.Add(df);
}

(どこで を宣言しているかは明確ではありませんが、実際に他の場所で使用していないと仮定すると、ステートメントdfで宣言するのが理にかなっています。または、完全に削除して.ifDownloadFileList.Add(new DownloadFileStruct(...))

于 2013-10-22T15:17:48.133 に答える
0

これを試して

 foreach (Match match in matches) {
    //When oveeride is false and you have to download all the files
    //OR
    //When override is true and a paticular file has to be downloaded
    if ((Override.Equals(false)) || (match.Groups[2].Value.Equals(OverrideFileName))) {
        //putting the matches from regular expression into DownloadFileStruct oject
        df = new DownloadFileStruct(match.Groups[1].Value, match.Groups[2].Value);

        //Adding DownloadFileStruct object to a array list
        DownloadFileList.Add(df);
    }

}
于 2013-10-22T15:24:57.413 に答える