清理TextFile /日志文件WinForms C#

时间:2016-09-22 07:13:59

标签: c# winforms

我目前正在编写一个winforms c#应用程序,它允许用户清理文本/日志文件。目前该应用程序正在运行,但如果文件大小为massibe,即10MB则需要一个年龄!

第一次清理它是为用户Windows Auth,即当时登录的用户。我有一个组织中所有用户的文本文件,大约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());
                    }

                }
            }

我的问题是,这是最有效的方法吗?或者有很多方法可以解决这个问题。代码工作正常,但是当你开始进入大文件时,速度非常慢。

1 个答案:

答案 0 :(得分: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();

这样,它会立即检查多个已记录的用户。

据我所知,Parallel LINQ(本例使用的)至少需要 .NET 4.0 。如果您无法访问.NET 4.0,则可以尝试手动创建一个或两个Threads,并让每个人处理loggedUsers的相等部分进行检查。他们每个人都会创建一个单独的foundUsers列表,然后将其报告给您,您可以使用List<T>.AddRange(anotherList)将它们合并到一个列表中。