2015-10-11 25 views
2

我有型數組(叫他)和IEnumarable(叫他B):如何統計IEnumerable <int>中int []的每個數字存在多少次?

B - 1,2,4,8,289 

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

我需要算多少次從A裏面乙存在於每個號碼和總結的結果。

例如:

B - 1,2,4,8,289 

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

result = 1+3+2+1+0 

什麼來實現它優雅的方式?

+0

您是否需要計算每個數字出現的次數或您需要的最終總數? – Stilgar

+0

您要麼計算B中每個數字出現在A中的次數,要麼您的數字集標記不正確。 – juharr

回答

4

隨着LINQ很容易:

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

計數多少次元件從A被包含在B.


作爲尤瓦Itzchakov指出,這可以簡化如下:

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

@Oliver你甚至可以縮短這個更多:'int count = A.Count(x => B.Contains(x));' –

+0

但是這不是他所要求的嗎?他需要計算每個數字出現的次數 – Stilgar

+0

@Stilgar:不,他的例子說「結果= 1 + 3 + 2 + 1 + 0」。所以他想要總數。 –

1

我需要數ho從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是一個集合,這意味着如果多次添加相同的數字,那麼只有該數字的一個副本將保留在集合中。

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 } 
1

甜蜜和簡單..一行方案中,各重複列表

爲什麼不試試呢..

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

可以sweap的A/B它仍然可以工作

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); 
     } 
    } 
} 
相關問題