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)