2016-09-22 70 views
0

我目前正在編寫一個winforms c#應用程序,它將允許用戶清理文本/日誌文件。目前該應用程序正在運行,但如果該文件的大小爲massibe,即10MB,則需要一個時間!清理文本文件/日誌文件WinForms C#

它所做的第一個清理是針對用戶Windows身份驗證,即當時登錄的用戶。我有一個組織中所有用戶的文本文件,大約有10,000個。

我這個加載到一個

List<string> loggedUsers = new List<string>(); 

string[] userList = System.IO.File.ReadAllLines(@"C:\temp\logcleaner\users.txt"); 
      foreach (string line in userList) 
      { 
       loggedUsers .Add(line.ToString()); 
      } 

接下來,我需要一個文本文件,並顯示在一個RichTextBox(rtbOrgFile),允許用戶看的見,目前有什麼樣的信息。然後用戶點擊一個按鈕,執行以下操作:

foreach (var item in loggedUsers) 
      { 
       if (rtbOrgFile.Text.Contains(item.ToString())) 
       { 
        if(foundUsers.Items.Contains(item.ToString())) 
        { 
         // already in list 
        } 
        else 
        { 
         foundUsers.Items.Add(item.ToString()); 
        } 

       } 
      } 

我的問題是,這是最有效的方法嗎?或者有很多方法可以解決這個問題。代碼工作正常,但是當你開始進入大文件時,它非常慢。

+0

去哪?請退出代碼並解釋您正在嘗試做什麼,然後我們可以查看代碼以確定這是否合適,現在我甚至都不知道您要在此處做什麼。 「淨化」是什麼意思?什麼是「loggedUsers」?那麼「找到用戶」呢? –

+0

對不起'清理' - 刪除任何/清理文件。 loggedUsers是我們組織內所有用戶的列表。 'FoundUsers'是一個列表框,如果在文本文件中找到'LoggedUser',則被填充,即,如果在文本文件中找到JBLOGGS,則它將包含JBLOGGS,它將被添加到foundUsers。該代碼然後爲在loggedUsers中列出的所有用戶循環。一個按鈕隨後會出現在'Clean'中,它將在系統輸出的文件中用DATAREMOVED替換任何找到的用戶。 – user1700974

回答

1

首先,我會建議爲你的加載列表如下:

List<string> loggeedUsers = System.IO.File.ReadAllLines("[...]users.txt").ToList(); 

您沒有指定您加載到RichTextBox多大的文本文件,但我相信它是相當大的,因爲它需要很長時間。

發現在this answer,它建議Lucene.NET搜索引擎,但它也提供了一種簡單的方法來多線程搜索沒有引擎,使其更快。 我會翻譯例子:

var foundUsers = loggeedUsers.AsParallel().Where(user => rtbOrgFile.Contains(user)).ToList(); 

這樣,它檢查多個用戶登錄一次。據我所知,你至少需要.NET 4.0(0123)這個例子使用了Parallel LINQ。如果您無法訪問.NET 4.0,則可以嘗試手動創建一個或兩個Threads,並讓每個人處理loggedUsers的相等部分以進行檢查。他們將分別製作一個單獨的foundUsers列表,然後將其報告給您,在那裏您將使用List<T>.AddRange(anotherList)將它們合併到單個列表中。

+0

好東西。會看看。我已經將循環從foreach更改爲for(int = i ...),並且其返回結果約爲1分30秒,而對於foreach則爲10分鐘以上。申請它。 – user1700974