HashSet上的LINQ与列表

时间:2019-05-16 14:56:10

标签: c# list linq count hashset

我需要计算具有给定值属性的列表/集合的元素。列表很大,我需要性能尽可能好。我应该使用列表还是集合(具有唯一元素时)?有没有更快的方法?

int counter = myList.Where(x => x.A == myValue || x.B == myValue).Count()

这已经在AsParallel().ForAll()里面了,还有另一个巨大的清单。不,我无法更改。

修改

我已经看过this question,它肯定不能解决我的问题,我对(P)LINQ查询中的差异很感兴趣。

1 个答案:

答案 0 :(得分:3)

如果您要遍历整个集合,则遍历整个列表可能会比遍历整个集合产生更好的性能,这是因为列表元素在内存中的分配方式(假设您正在使用List<T>,不是链表)。

如果您要对myList中的相同数据执行数千个此类查询,则可以通过在x.Ax.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;