2012-08-07 16 views
5

Soy nuevo en C# y espero poder obtener ayuda sobre este tema. Tengo una matriz con elementos y necesito mostrar cuántas veces aparece cada elemento.Cómo mostrar cuántas veces aparece un elemento de matriz

Por ejemplo, en [1, 2, 3, 4, 4, 4, 3], 1 aparece una vez, 4 aparece tres veces, y así sucesivamente.

he hecho lo siguiente, pero don `t saber cómo ponerlo en el foreach/instrucción 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") 
} 

Gracias usted, y lo siento si esto es una muy básica ...

+0

Si esta es la tarea, por favor etiquetar como tal. – FishBasketGordo

+0

no, no lo estoy, solo estoy aprendiendo e intentando hacerlo :-) – Momo

+1

Intente usar un 'Diccionario ' donde cada tecla representa una entrada única, y el valor representa un conteo. Cada vez que pulse una tecla existente, incremente su valor en 1. –

Respuesta

11

Puede manejar esto a través de Enumerable.GroupBy. Recomiendo mirar la sección C# LINQ samples en Count y GroupBy para obtener orientación.

En su caso, esto puede ser:

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

Puede mantener un Dictionary de elementos encontrados, así como sus recuentos asociados. En el ejemplo siguiente, dict[d] se refiere a un elemento por su valor. Por ejemplo 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); 
} 

Cuando el bucle termina foreach que tendrá una entrada por cada valor único en dict. Puede obtener el recuento de cada elemento accediendo al dict[d], donde d es un valor entero de su lista original.

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

El LINQ respuestas son buenas, pero si usted está tratando de hacerlo usted mismo:

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

¿Por qué asignó 6 espacios para numberFound pero solo tiene 5? – JonH

+0

@JonH Para que numberFound [x] corresponda a x, no a x-1. (numberFound oscilará entre ** 0 ** y 5.) – ispiro

+0

Ahh sí, tiene razón, no miré de cerca en la lista. – 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

Este es el mismo concepto que [respuesta de @ Yuck] (http://stackoverflow.com/a/11850986/150605) desde hace 4.5 años, excepto que la solución accede a cada elemento de la matriz exactamente una vez y esta itera a través del resto de la array cada vez que se encuentra un nuevo valor. Además, ¿cuál es el propósito de recuperar un elemento de matriz de tipo 'int', formateándolo como' cadena', y luego volver a analizarlo como 'int'? ¿Por qué no simplemente usar 'intergernumberArrays [i]' en lugar de 'int.Parse (intergernumberArrays [i] .ToString())'? – BACON

Cuestiones relacionadas