Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq包含两个巨大的列表,需要很长时间_C#_.net_Performance_List_Linq - Fatal编程技术网

C# Linq包含两个巨大的列表,需要很长时间

C# Linq包含两个巨大的列表,需要很长时间,c#,.net,performance,list,linq,C#,.net,Performance,List,Linq,当我想将一个巨大的列表(大约700000个元素)与一个特定的属性和字符串列表进行比较时,需要很长时间 我试过阿斯巴利尔,但它对我没有任何帮助。我需要removedSuccessFromList的列表,因为我想使用此列表启动Parallel.Foreach List<string> successStrings = service.GetProperty().Select(q => q.IdString).ToList(); List<Property> remo

当我想将一个巨大的列表(大约700000个元素)与一个特定的属性和字符串列表进行比较时,需要很长时间

我试过阿斯巴利尔,但它对我没有任何帮助。我需要removedSuccessFromList的列表,因为我想使用此列表启动Parallel.Foreach

List<string> successStrings = service.GetProperty().Select(q => 
q.IdString).ToList();

List<Property> removedSuccessFromList = properties.AsParallel().Where(q => 
!successStrings.Contains(q.IdString)).ToList();
List successStrings=service.GetProperty().Select(q=>
q、 IdString.ToList();
List removedSuccessFromList=properties.aspallel()。其中(q=>
!successStrings.Contains(q.IdString)).ToList();

如果在
successStrings
中有大量字符串,请使用mre有效的数据结构,如哈希集:

var successStrings = new HashSet<string>(service.GetProperty().Select(q => q.IdString));

List<Property> removedSuccessFromList = properties.Where(q => !successStrings.Contains(q.IdString)).ToList();
var successStrings=newhashset(service.GetProperty().Select(q=>q.IdString));
List removedSuccessFromList=properties.Where(q=>!successStrings.Contains(q.IdString)).ToList();

List.Contains
方法的复杂性为O(N),因此它扫描所有元素以查找匹配项<代码>哈希集。包含的复杂性为O(1)-它可以检查元素是否存在非常大。

如果在
successStrings
中有很多字符串,则使用mre有效的数据结构,如哈希集:

var successStrings = new HashSet<string>(service.GetProperty().Select(q => q.IdString));

List<Property> removedSuccessFromList = properties.Where(q => !successStrings.Contains(q.IdString)).ToList();
var successStrings=newhashset(service.GetProperty().Select(q=>q.IdString));
List removedSuccessFromList=properties.Where(q=>!successStrings.Contains(q.IdString)).ToList();

List.Contains
方法的复杂性为O(N),因此它扫描所有元素以查找匹配项<代码>哈希集。包含的复杂性为O(1)-它可以检查元素是否存在非常大。

如果您的
IdString
是唯一的,您可以从
Where
逻辑中的successstring中删除每个创建的项,因此列表最终会变小。

如果您的
IdString
是唯一的,您可以从中的successstring中删除每个创建的项
其中
逻辑使列表最终变小

“需要很长时间”。。。这一基准是如何实现的?如何将一个“长时间”与另一个“长时间”进行比较?SuccessString有多大?属性有多大?大小可以matter@Evk我假设
properties
是700k,但是:是的,最好知道两个输入的大小“需要很长时间”。。。这一基准是如何实现的?如何将一个“长时间”与另一个“长时间”进行比较?SuccessString有多大?属性有多大?大小可以matter@Evk我假设
properties
是700k,但是:是的,最好知道两个输入的大小O(1)可以比O(N)慢,特别是对于小N。这是否是一个实际的改进在很大程度上取决于
successStrings的大小
注意O(1)可以比O(N)慢,特别是对于小N。这是否是一个实际的改进在很大程度上取决于
successStrings
的大小,这不会自动成为一个改进;由于OP使用的是并行的,所以需要进行同步,这可能会增加显著的影响impact@MarcGravell是的,我建议不要使用并行,只在16核上运行O(N)算法。在一个内核上运行更好的算法应该会更有效。这种方法需要很长时间,但我可以看到进展。这不会自动成为一种改进;由于OP使用的是并行的,所以需要进行同步,这可能会增加显著的影响impact@MarcGravell是的,我建议不要使用并行,只在16核上运行O(N)算法。在一个内核上运行更好的算法应该会更有效。这种方法会花费很长时间,但我可以看到进展。