如何计算IEnumerable <int>中int []中每个数字的存在次数?

时间:2015-10-11 18:45:08

标签: c#

我有一些整数(叫他A)和IEnumarable(叫他B):

B - 1,2,4,8,289

A - 2,2,56,2,4,33,4,1,8,

我需要计算B中A的每个数字存在多少次并对结果求和。

例如:

B - 1,2,4,8,289

A - 2,2,56,2,4,33,4,1,8,

result = 1+3+2+1+0

实现它的优雅方式是什么?

5 个答案:

答案 0 :(得分:4)

使用LINQ很容易:

int count = A
    .Where(x => B.Contains(x))
    .Count();

计算B中包含A的元素的次数。

正如Yuval Itzchakov所指出的,这可以简化为:

int count = A.Count(x => B.Contains(x));

答案 1 :(得分:1)

  

我需要计算B中A的每个数字存在多少次并对结果求和。

您可以按如下方式获得计数和总和

List<int> b = new List<int>() { 1,2,4,8,289 };
List<int> a = new List<int>() { 2,2,56,2,4,33,4,1,8 };

var subset = a.Where(i => b.Contains(i));
var count = subset.Count(); // 7
var sum = subset.Sum();  // 23

请注意,我重复使用相同的Linq表达式来获取计数和总和。

有人可能会试图使用HashSet<int>代替List<int>,因为.Contains操作更快。但是,HashSet是一个集合,这意味着如果多次添加相同的数字,则该集合中只剩下该数字的一个副本。

答案 2 :(得分:1)

使用Linq,你可以这样做

var B = new List<int>{ 1, 2, 4, 8, 289 };
var A = new List<int> { 2, 2, 56, 2, 4, 33, 4, 1, 8 };

var repetitionSum = B.Select(b => A.Count(a => a == b)).Sum(); //result = 7

如果你愿意,你可以像这样获得个人重复列表

var repetition = B.Select(b => A.Count(a => a == b)).ToList();
// { 1, 3, 2, 1, 0 }

答案 3 :(得分:1)

甜蜜而简单..一线解决方案

为什么不尝试..

        int sum = 0;
        A.ToList().ForEach(a=>sum +=B.Count(b=>b==a));
        Console.Write(sum);

你可以将A / B转移它仍然有效

答案 4 :(得分:1)

目前尚不清楚您是否想知道每个数字的出现次数或最终计数(您的文本和示例代码不同)。以下是获取每个数字出现次数的代码

using System;
using System.Linq;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        int[] a = new []{1,2,3};
        int[] b = new []{1,2,2,3};
        Dictionary<int, int> aDictionary = a.ToDictionary(i=>i, i => 0);

        foreach(int i in b)
        {
            if(aDictionary.ContainsKey(i))
            {
                aDictionary[i]++;
            }
        }

        foreach(KeyValuePair<int, int> kvp in aDictionary)
        {
            Console.WriteLine(kvp.Key + ":" + kvp.Value);
        }
    }
}