我需要计算具有给定值属性的列表/集合的元素。列表很大,我需要性能尽可能好。我应该使用列表还是集合(具有唯一元素时)?有没有更快的方法?
int counter = myList.Where(x => x.A == myValue || x.B == myValue).Count()
这已经在AsParallel().ForAll()
里面了,还有另一个巨大的清单。不,我无法更改。
修改
我已经看过this question,它肯定不能解决我的问题,我对(P)LINQ查询中的差异很感兴趣。
答案 0 :(得分:3)
如果您要遍历整个集合,则遍历整个列表可能会比遍历整个集合产生更好的性能,这是因为列表元素在内存中的分配方式(假设您正在使用List<T>
,不是链表)。
如果您要对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());
现在,您可以使用inclusion-exclusion principle将查询转换为三个查询:
countByA.TryGetValue(myValue, out var counterA);
countByB.TryGetValue(myValue, out var counterB);
countByAandB.TryGetValue(myValue, out var counterAandB);
int counter = counterA + counterB - counterAandB;