2012-08-07 23 views
5

Sono nuovo al C# e spero di poter ottenere aiuto su questo argomento. Ho un array con elementi e ho bisogno di visualizzare quante volte ogni elemento appare.Come visualizzare quante volte viene visualizzato un elemento dell'array

Ad esempio, in [1, 2, 3, 4, 4, 4, 3], 1 appare una volta, 4 appare tre volte e così via.

Ho fatto quanto segue, ma don `t sapere come mettere in foreach/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") 
} 

voi Grazie e scusate se questo è molto semplice ...

+0

Se questa è la compiti a casa, si prega di etichettare come tale. – FishBasketGordo

+0

no, non sto imparando e sto provando a farlo :-) – Momo

+1

Prova ad usare un 'dizionario ' dove ogni chiave rappresenta una voce univoca e il valore rappresenta un conteggio. Ogni volta che premi una chiave esistente, incrementa il suo valore di 1. –

risposta

11

È possibile gestire questo tramite Enumerable.GroupBy. Consiglio di consultare la sezione C# LINQ samples su Count e GroupBy come guida.

Nel tuo caso, questa può essere:

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

È possibile mantenere una Dictionary di articoli trovati così come i loro conteggi associate. Nell'esempio seguente, dict[d] fa riferimento a un elemento in base al suo valore. Ad esempio 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); 
} 

Quando il ciclo termina foreach avrai una voce per ogni valore unico in dict. È possibile ottenere il conteggio di ciascun articolo accedendo a dict[d], dove d è un valore intero dall'elenco originale.

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

Il LINQ risposte sono belle, ma se si sta cercando di farlo da soli:

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

Perché hai allocato 6 spazi per numberFound ma solo 5? – JonH

+0

@JonH In modo che numberFound [x] corrisponda a x, non a x-1. (numberFound varia da ** 0 ** a 5.) – ispiro

+0

Ahh sì, hai ragione non ho guardato da vicino l'elenco. – 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

Questo è lo stesso concetto di [@ risposta di Yuck] (http://stackoverflow.com/a/11850986/150605) di 4,5 anni fa, eccetto che la soluzione accede a ciascun elemento dell'array esattamente una volta e questa itera attraverso il resto del array ogni volta che viene rilevato un nuovo valore. Inoltre, qual è lo scopo di recuperare un elemento di matrice di tipo 'int', formattandolo come' stringa', quindi analizzandolo in un 'int'? Perché non usare solo 'intergernumberArrays [i]' invece di 'int.Parse (intergernumberArrays [i] .ToString())'? – BACON

Problemi correlati