2012-08-07 8 views
5

私はC#を初めて使用しています。私は要素を持つ配列を持っており、各項目が何回出現するかを表示する必要があります。配列要素が何回出現するかを表示する方法

たとえば、[1, 2, 3, 4, 4, 4, 3]には、が1回、4が3回出現するなどのように続きます。

私は以下のが、これは非常に基本的なものであれば... if文

int[] List = new int[]{1,2,3,4,5,4,4,3}; 
foreach(int d in List) 
{ 
    if("here I want to check for the elements") 
} 

おかげで、あなたを、そして申し訳ありません/ foreachの中にそれを置く方法を知っている `tを...

を行っています
+0

これは宿題であれば、そのようにタグを付けてください。 – FishBasketGordo

+0

いいえ、私はちょうど学び、それをしようとしています:-) – Momo

+1

各キーが一意のエントリを表し、値がカウントを表す 'Dictionary 'を使ってみてください。既存のキーを押すたびに、その値を1増やします。 –

答えて

11

これはEnumerable.GroupByで処理できます。ガイダンスについては、Count and GroupByのC# LINQ samplesセクションを参照することをお勧めします。あなたのケースでは

、これは指定できます

int[] values = new []{1,2,3,4,5,4,4,3}; 

var groups = values.GroupBy(v => v); 
foreach(var group in groups) 
    Console.WriteLine("Value {0} has {1} items", group.Key, group.Count()); 
7

あなたがそれらに関連する数だけでなく、見つかった項目のDictionaryを維持することができます。以下の例では、dict[d]はその値で要素を参照します。たとえば、d = 4です。

int[] List = new int[]{1,2,3,4,5,4,4,3}; 
var dict = new Dictionary<int, int>(); 
foreach(int d in List) 
{ 
    if (dict.ContainsKey(d)) 
     dict[d]++; 
    else 
     dict.Add(d, 1); 
} 

foreachループはあなたがdictに一意の値ごとに1つのエントリがあります終了します。 dict[d]にアクセスして、各項目の数を得ることができます。dは元のリストの整数値です。

1
var list = new int[] { 1, 2, 3, 4, 5, 4, 4, 3 }; 
var groups = list.GroupBy(i => i).Select(i => new { Number = i.Key, Count = i.Count() }); 
3

LINQの答えはいいですが、あなたはそれを自分でやろうとしている場合:

int[] numberFound = new int[6]; 
int[] List = new int[] { 1, 2, 3, 4, 5, 4, 4, 3 }; 
foreach (int d in List) 
{ 
    numberFound[d]++; 
} 
+0

なぜnumberFoundに6つのスペースを割り当てましたか?本当に5つしかありませんでしたか? – JonH

+0

@JonH numberFound [x]はxに対応し、x-1には対応しません。 (numberFoundは、** 0 ** **から5までの範囲になります) – ispiro

+0

ああ、あなたは正しいです。私はリストをよく見ていませんでした。 – JonH

-1
public static void ArrayNumbersCount() 
    { 
     int number=0; 
     int count=1; 
     Dictionary<int, int> collection = new Dictionary<int, int>(); 
     int[] intergernumberArrays = { 1, 2, 3, 4, 1, 2, 4, 1, 2, 3, 5, 6, 1, 2, 1, 1, 2 }; 
     for (int i = 0; i < intergernumberArrays.Length; i++) 
     { 
      number = int.Parse(intergernumberArrays[i].ToString()); 
      if (!collection.ContainsKey(number)) 
      { 
       for (int j = i + 1; j < intergernumberArrays.Length; j++) 
       { 
        if (int.Parse(intergernumberArrays[i].ToString()) == int.Parse(intergernumberArrays[j].ToString())) 
        { 
         count++; 
        } 
       } 
       collection.Add(number, count); 
      } 
      count = 1; 
      number = 0; 
     } 
     foreach (var kvp in collection.ToList()) 
     { 
      Console.WriteLine("{0} {1}", kvp.Key, kvp.Value);     
     }    
    } 
+1

これは4.5年前の[@ Yuck's answer](http://stackoverflow.com/a/11850986/150605)と同じ概念ですが、ソリューションは各配列要素に一度だけアクセスし、この要素は新しい値が出現するたびに配列を返します。また、 'int'型の配列要素を検索し、' string'としてフォーマットし、それを 'int'に構文解析する目的は何ですか? 'int.Parse(intergernumberArrays [i] .ToString())'の代わりに 'intergernumberArrays [i]'を使うのはどうですか? – BACON

関連する問題