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;