C# Linq包含两个巨大的列表,需要很长时间
当我想将一个巨大的列表(大约700000个元素)与一个特定的属性和字符串列表进行比较时,需要很长时间 我试过阿斯巴利尔,但它对我没有任何帮助。我需要removedSuccessFromList的列表,因为我想使用此列表启动Parallel.ForeachC# 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
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)算法。在一个内核上运行更好的算法应该会更有效。这种方法会花费很长时间,但我可以看到进展。