2012-05-02 64 views
-2

我有一些代碼行如下。LINQ/lambda表達式的性能調整

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

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

運行檢查性能的工具時,它顯示上述語句中的性能警告。

我想讓這個更多的性能可行。我聽說嵌套的lambda表達式在執行時比較慢。

請建議一些東西來對付這個或任何有助於解決問題的鏈接。

+1

您能說明代碼應該做什麼嗎? – TJHeuvel

+0

你能寫出你需要滿足的要求嗎?目前,你正在向你展示你是如何得到某些東西的,如果你說出你想得到的東西,這可能會更容易。 – empi

+0

此代碼不會編譯:方法'Contains'沒有超載需要0個參數 –

回答

0

嘗試將搜索到的數據(或其全部,在您的應用程序啓動之前)緩存到Dictionary<,>

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 
} 

,我不認爲還有很大的性能改進。

0

如果我的假設是正確的,列表中包含文件的路徑我認爲主要問題是你分割路徑以獲取文件名。改爲使用功能Path.GetDirectoryNamePath.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 
+0

使用'Count()> 0'而不是'Any()'會嚴重影響性能。 – Henrik

+0

好點,編輯到FirstOrDefault,它不會枚舉整個列表,而是 – mortb

+0

好的,我刪除了downvote。 – Henrik