计算linq中两个数组中相同元素的数量

Posted

技术标签:

【中文标题】计算linq中两个数组中相同元素的数量【英文标题】:count number of identical elements in two arrays in linq 【发布时间】:2012-04-23 11:42:39 【问题描述】:

我有 2 个字符串数组:

A1: "aa","bb","cc","dd","ee"
A2: "cc","dd,"ee","bla","blu"

如何计算A1A2 之间相同元素的数量(在本例中为 3)?

【问题讨论】:

如果其中一个数组中有重复项,您希望发生什么? 我希望他们算作 1 场比赛 【参考方案1】:

最短的可能是这样的:

A1.Intersect(A2).Count()

【讨论】:

这短了 3 个字符。 A1.Count(A2.Contains) :) (不过我还是更喜欢你的解决方案) @BlueVoodoo 在存在重复项的情况下,Count Contains 方法是否正确? (见提问者的澄清评论) @BlueVoodoo,出于兴趣,a1.Count(a2.Contains);以 00:00:05.7862636 获胜! @ericosg - 这实际上很有趣。很高兴知道。 @ericosg 这可能会根据列表的大小而改变。包含进行线性搜索(每次通过 Count 的循环);我怀疑 Intersect 做了一些更聪明的事情。【参考方案2】:

以下效果很好,使用列表时可能会产生更高的性能:

List<string> a1 = new List<string>()  "aa", "bb", "cc", "dd", "ee" ;
List<string> a2 = new List<string>()  "cc", "dd", "ee", "bla", "blu" ;

a1.Count(match => a2.Contains(match));

或者(感谢@BlueVoodoo)一个更短的解决方案,它的执行速度略快:

a1.Count(a2.Contains);

但这些解决方案也计算重复,因此可以使用:

HashSet<string> a1 = new HashSet<string>()  "aa", "bb", "cc", "dd", "ee" ;
HashSet<string> a2 = new HashSet<string>()  "cc", "dd", "ee", "bla", "blu" ;

这避免了重复,因为 HashSet 只保留一个唯一的序列。

经过上述基准测试,HashSet 与 a1.Count(a2.Contains);提供了最快的解决方案,即使有构建 HashSet 的开销。

【讨论】:

无需将它们放入列表中,因为您可以直接在数组上执行 A1.Count(A2.Contains)(不过我仍然会选择 Pavel 的相交)。 出于兴趣,这个解决方案的运行速度比 Intersect() 快 进一步感兴趣的是一些基准测试:在 10000000 次迭代中,Intersect vs Linq 和 Lambda:列表:00:00:09.9623558 vs 00:00:06.2140126,数组:00:00:09.5918331 vs 00:00 :48.9175518 自然地,linq 不断从数组创建 IEnumerable 对象,产生开销,但是一旦所有列表它实际上更快! 在您发布此内容 5 分钟后,asker 澄清了存在重复项时所需的行为。你可能想修改你的答案...【参考方案3】:
int[] id1 =  44, 26, 92, 30, 71, 38 ;
int[] id2 =  39, 59, 83, 47, 26, 4, 30 ;

id1.Intersect(id2).Count();

【讨论】:

【参考方案4】:

下面的代码应该可以解决问题

        var A1 = new[]  "aa", "bb", "cc", "dd", "ee";
        var A2 = new[]  "cc", "dd", "ee", "bla", "blu" ;

        var query = from one in A1
                    join two in A2 on one equals two
                    select one;
        var result = query.ToArray();//this should have  "cc", "dd", "ee" 

【讨论】:

以上是关于计算linq中两个数组中相同元素的数量的主要内容,如果未能解决你的问题,请参考以下文章

在jquery中计算具有相同类的元素的数量

计算数组的非空元素 - LINQ 性能问题 [重复]

如何计算 NumPy bool 数组中真实元素的数量

计算布尔数组中真(或假)元素的数量?

如何使用 Diesel 计算数组列中不同元素的数量?

计算数组中不同元素数量的最快方法