-2

以下のようなコード行があります。

string result = listDetails
    .Where(filename => filename.Contains(fullname)).FirstOrDefault().Split('\\')
    .Where(name => name.Contains(nameGivenToSearch)).FirstOrDefault();

if (result.Contains("sd"))
    // Do something

パフォーマンスをチェックするためのツールを実行すると、上記のステートメントでパフォーマンスの警告が表示されます。

これをもっと実現できるようにしたい。ネストされたラムダ式は実行が遅いと聞きました。

これに対抗する何か、または問題の解決に役立つリンクを提案してください。

4

3 に答える 3

0

私はそれを次のように書き直します:

string result = listDetails.FirstOrDefault(filename => filename.Contains(fullname));
if (result != null)
    result = result.Split('\\').FirstOrDefault(name => name.Contains(namegiventosearch));
if (result != null && result.Contains("sd"))
{
     //do task
}

パフォーマンスを改善する余地はあまりないと思います。

于 2012-05-02T10:46:25.360 に答える
0

リストにファイルへのパスが含まれているという私の仮定が正しければ、主な問題はパスを分割してファイル名を取得することだと思います。代わりに関数Path.GetDirectoryNameandを使用してください。Path.GetFileName最大 1000 個の文字列エントリのリストを検索しても、プロセッサに負荷がかからないようにする必要があります

    if (listDetails.Where(x => { if(Path.GetDirectoryName(x).Contains(fullname))
                                 {
                                    var file = Path.GetFileName(x);
                                    return file.Contains(namegiventosearch) && file.Contains("sd");
                                 }
                                 else 
                                 {
                                    return false;
                             }
    }).FirstOrDefault() != null)
    {
         // do Task
    }
enter code here
于 2012-05-02T11:11:51.663 に答える
0

検索したデータ (またはアプリの開始前にすべて) をDictionary<,>にキャッシュしてみてください。

于 2012-05-02T09:44:36.313 に答える