我有一些整数(叫他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
实现它的优雅方式是什么?
答案 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);
}
}
}