C# 更快地在列表中查找特定项

C# 更快地在列表中查找特定项,c#,performance,C#,Performance,我有一个包含814万行的文本文件。我正在尝试查找包含特定单词的所有行。下面的代码中有一个******部分。在那一段上需要1.07秒。这个速度太慢了,我想找到最快的方法 我怎样才能做得最快 // The Random.txt file contains 8.14 million items of the below format. // format = [groupnumber],[name],[num1],[num2],[num3],[num4],[num5],[num6] //

我有一个包含814万行的文本文件。我正在尝试查找包含特定单词的所有行。下面的代码中有一个
******
部分。在那一段上需要1.07秒。这个速度太慢了,我想找到最快的方法

我怎样才能做得最快

// The Random.txt file contains 8.14 million items of the below format.  
// format = [groupnumber],[name],[num1],[num2],[num3],[num4],[num5],[num6]    

// group1,car,1,22,37,39,42,45  
// group2,fruit,1,12,13,14,22,36  
// group3,robot,4,6,9,31,32,34  
// group4,cat,11,12,17,19,42,45  
// group5,dog,40,41,42,43,44,45  
// ...
// ...

// load file to list group1  
var group1 = File.ReadLines("Random.txt", Encoding.Default).ToList();  

*****************************************************************************************  
//I want this section to be faster
Stopwatch w = new Stopwatch();
w .Start();  

// Find items in group1 that contain all 4,6,9,31,32 in num area  
var group2 = group1.AsParallel().Select(x => x + ",").Where(x => x.Contains(",4,")  
                                                && x.Contains(",6,")  
                                                && x.Contains(",9,")  
                                                && x.Contains(",31,")  
                                                && x.Contains(",32,"))  
                                    .Select(x => x.Substring(0, x.Length - 1)).ToList();  
w .Stop();
//Elapsed Time : 00:00:01.0722169  
//I want this section to be faster
******************************************************************************************  

这可以为您节省2个选项:

    var group2 = group1.AsParallel().Where(temp => {
                                                var x = temp + ",";
                                                return x.Contains(",4,")  
                                            && x.Contains(",6,")  
                                            && x.Contains(",9,")  
                                            && x.Contains(",31,")  
                                            && x.Contains(",32,");}
                                );

您是在谈论静态数据、多次执行场景,还是在谈论更改数据/一次执行?为什么在Where?Natrium之前需要
Select(x=>x+“,”)
,我想是为了抓住字符串以他们正在搜索的某个数字结尾,但后面没有逗号的情况。您的预算是多少?(买一台更快的计算机,买很多更快的计算机,买一个实验室来发明一台更快的计算机)。我不明白为什么一个人会使用
File.ReadLines()
,然后马上调用
ToList()
,因为这违背了
File.ReadLines()
的目的。如果不立即需要结果,可以正确迭代
File.ReadLines()
的输出,并
返回结果。如果您在其他地方使用这些结果,则当实际使用数据时,枚举可能已经完成(但您仍然可以枚举结果)。因此,本节使用的时间几乎是
0
。感谢您告诉我们出了什么问题。速度显著提高。00:00:01.0722169 → 00:00:00.0002653@sera如果不调用
.ToList()
,则有一个并行查询,它本身就是一个
IEnumerable
。因此,您没有具体化查询结果。我在我发布的评论中描述了它。@Jimi Jimi很抱歉你的观点是正确的。问题的关键在于。我刚刚注意到删除.ToList()更快。每个人都给了我正确的教导。非常感谢。@sera我希望您只删除了
ReadLines
之后的
ToList
,而不是您测量的
ToList
。。。