我目前正在编写一个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());
}
}
}
我的问题是,这是最有效的方法吗?或者有很多方法可以解决这个问题。代码工作正常,但是当你开始进入大文件时,速度非常慢。
答案 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)
将它们合并到一个列表中。