计算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"
如何计算A1
和A2
之间相同元素的数量(在本例中为 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中两个数组中相同元素的数量的主要内容,如果未能解决你的问题,请参考以下文章