C# 其中LINQ在哈希集与列表上
我需要计算具有给定值的属性的列表/集合的元素。名单是巨大的,我需要尽可能好的表现。我应该使用列表还是集合(当有唯一元素时)?有没有更快的办法C# 其中LINQ在哈希集与列表上,c#,list,linq,count,hashset,C#,List,Linq,Count,Hashset,我需要计算具有给定值的属性的列表/集合的元素。名单是巨大的,我需要尽可能好的表现。我应该使用列表还是集合(当有唯一元素时)?有没有更快的办法 int counter = myList.Where(x => x.A == myValue || x.B == myValue).Count() 这已经在另一个巨大列表的aspallel().ForAll()中。不,我不能改变 编辑 我已经看到了,但它肯定不能解决我的问题,我对(p)LINQ查询中的差异感兴趣。如果要遍历整个集合,遍历整个列表可能
int counter = myList.Where(x => x.A == myValue || x.B == myValue).Count()
这已经在另一个巨大列表的aspallel().ForAll()
中。不,我不能改变
编辑
我已经看到了,但它肯定不能解决我的问题,我对(p)LINQ查询中的差异感兴趣。如果要遍历整个集合,遍历整个列表可能会产生比遍历整个集合更好的性能,因为列表元素在内存中的分配方式(假设您使用的是
列表
,而不是链表)
如果您在myList
中对相同的数据执行数千次这样的查询,您可以通过构建三个查找表来提高性能,即x.A
、x.B
,以及x.A==x.B
时的公共值:
var countByA = myList
.GroupBy(x => x.A)
.ToDictionary(g => g.Key, g => g.Count());
var countByB = myList
.GroupBy(x => x.B)
.ToDictionary(g => g.Key, g => g.Count());
var countByAandB = myList
.Where(x => x.A == x.B)
.GroupBy(x => x.A)
.ToDictionary(g => g.Key, g => g.Count());
现在,可以使用以下命令将查询转换为三个查找:
我应该使用列表还是集合?您是否确实尝试过对它们计时?使用
aspallel().ForAll()可能会重复
可能会通过阻止适当的并行化来消除任何提高性能的机会。对于这个特定查询,两个类都不提供任何搜索加速,因为您必须读取每个项来提取A和B值。但是,A哈希集
的遍历速度较慢。完整查询做什么?为什么不让PLINQ并行化t整个查询而不是在本地构建列表?一个写得好的查询可以让PLINQ对源数据进行分区,并在一次过程中使用所有核心来处理分区。您发布的代码片段表明,对源数据中的每个项目进行复杂而缓慢的扫描……那么数组=>何处=><代码>长度
?那会更快吗?对不起,你能解释一下int counter=countbyattributesandb[(x.A,x.B)];
?(x.A,x.B)
从A,B值构造一个元组。字典使用元组并计数为键。顺便说一句,如果myList
很大(数千项),你可以使用AsParallel()
以加快分组和字典构造,例如myList.AsParallel().GroupBy(…).ToDictionary(…)
@Antiohia dasblinkenlight所做的基本上是基于A和B的myList上的索引。您可以为每个属性创建单独的索引。这样,总计数将是每个“索引”返回的值的总和。您必须解释整个上下文。您真的需要计数吗?还是只是为了检查是否存在?@NetMage应用包含排除原则需要减去x.A
和x.B
都等于myValue
的对象数,这意味着我的查找表不需要存储t个对象,其中x.A!=x.B
。这是一个绝妙的答案!
countByA.TryGetValue(myValue, out var counterA);
countByB.TryGetValue(myValue, out var counterB);
countByAandB.TryGetValue(myValue, out var counterAandB);
int counter = counterA + counterB - counterAandB;