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

我有 2 个字符串数组:

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

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

【问题讨论】:

  • 如果其中一个数组中有重复项,您希望发生什么?
  • 我希望他们算作 1 场比赛

标签: c# arrays linq


【解决方案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" }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多