Saltar al contenido

Generación de histograma simple de datos enteros en C#

Agradecemos tu ayuda para difundir nuestras secciones acerca de las ciencias informáticas.

Solución:

Podrías usar SortedDictionary

uint[] items = new uint[] 5, 6, 1, 2, 3, 1, 5, 2; // sample data
SortedDictionary histogram = new SortedDictionary();
foreach (uint item in items) 
    if (histogram.ContainsKey(item)) 
        histogram[item]++;
     else 
        histogram[item] = 1;
    

foreach (KeyValuePair pair in histogram) 
    Console.WriteLine("0 occurred 1 times", pair.Key, pair.Value);

Sin embargo, esto dejará fuera los contenedores vacíos.

Basado en la sugerencia de BastardSaint, se me ocurrió un envoltorio ordenado y bastante genérico:

public class Histogram : SortedDictionary

    public void IncrementCount(TVal binToIncrement)
    
        if (ContainsKey(binToIncrement))
        
            this[binToIncrement]++;
        
        else
        
            Add(binToIncrement, 1);
        
    

Así que ahora puedo hacer:

const uint numOfInputDataPoints = 5;
Histogram hist = new Histogram();

// Fill the histogram with data
for (uint i = 0; i < numOfInputDataPoints; i++)

    // Grab a result from my algorithm
    uint numOfIterationsForSolution = MyAlorithm.Run();

    // Add the number to the histogram
    hist.IncrementCount( numOfIterationsForSolution );


// Report the results
foreach (KeyValuePair histEntry in hist.AsEnumerable())

    Console.WriteLine("0 occurred 1 times", histEntry.Key, histEntry.Value);

Me tomó un tiempo descubrir cómo hacerlo genérico (para empezar, simplemente anulé el SortedDictionary constructor, lo que significaba que solo podía usarlo para uint keys).

Puedes usar Linq:

var items = new[] 5, 6, 1, 2, 3, 1, 5, 2;
items
    .GroupBy(i => i)
    .Select(g => new 
        Item = g.Key,
        Count = g.Count()
    )
    .OrderBy(g => g.Item)
    .ToList()
    .ForEach(g => 
        Console.WriteLine("0 occurred 1 times", g.Item, g.Count);
    );

No se te olvide comunicar esta división si te fue útil.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *