2013-04-03 108 views
0

我正在嘗試從特定目錄搜索許多文本文件,然後使用textchanged事件在所有文件中查找文本,並僅在屏幕上顯示包含該文本的行文本。在文本框中搜索大量文本文件,並將其顯示在文本框中

目前它正在工作,但它太慢了。我發佈了一個搜索文本並在列表框中顯示的函數。什麼可能是使其工作速度不快的最有效的方式。

listBox2.Items.Clear(); 
ArrayList lines = new ArrayList(); 

if (txtfile.Count > 0) 
{ 
    for (int i = 0; i < txtfile.Count; i++) 
    { 
     lines.AddRange((File.ReadAllLines(Path.Combine(path, txtfile[i].ToString())))); 
    } 
    for (int i = 0; i < lines.Count; i++) 
    { 
     if(lines[i].ToString().IndexOf(txt,StringComparison.InvariantCultureIgnoreCase)>=0) 

     { 
       listBox2.Items.Add(lines[i].ToString()); 
     }  
    } 

} 
+0

什麼是'txt',什麼是'txtfile'? –

+0

隨着'TextChanged'事件的發生,隨着'Textbox'中文本的每一次變化,搜索都會反思,這會導致性能下降。可能會觸發基於Button_Click的搜索,而不是觸發添加或刪除的每個字符的TextChanged事件。 – jordanhill123

+0

@TimSchmelter txt是要搜索的文本,而txtfile是包含所有要搜索的文件的數組 –

回答

2

您要搜索多少個文件?你總是可以對其進行索引,存儲的內容在SQL數據庫中,當然使用的Parallel.For

Parallel.For(1, 1000, i => 
    { 
     //do something here. 
    } 
); 
+0

此鏈接可能也有幫助:http://msdn.microsoft.com/en-us/library/ff477033.aspx –

0

我會用Directory.EnumerateFilesFile.ReadLines,因爲它們是記憶不那麼飢餓了:

var matchingLines = Directory.EnumerateFiles(path, ".txt", SearchOption.TopDirectoryOnly) 
    .SelectMany(fn => File.ReadLines(fn)) 
    .Where(l => l.IndexOf(txt, StringComparison.InvariantCultureIgnoreCase) >= 0); 
foreach (var line in matchingLines) 
    listBox2.Items.Add(line); 

我會也僅在用戶明確觸發它時進行搜索,所以按鈕單擊而不是文本更改。

相關問題