[C#] kolejka Queue a liczby int

0

Robie program symulacyjny planowaniu czasu procesora. Musze zawrzeć w nim statystyki. Mam problem ze srednia. Skorzystałem z kolejki Queue, ale nie potrafie odzyskać z niej int. Idea jest taka ze wczytuje do tablicy liczby z kolejki dodaje je potem licze srednia i znowu wrzucam je do kolejki. Co lepsze ze miejsce w ktorym wywala blad działą jakies raz albo dwa potem dopiero debuger zatrzymuje działanie programu.

float[] SJF_przet_tab = new float[SJF_przet.Count];

            float dzielnik = SJF_przet.Count;
            float dzielna = 0;

            for (int i = 0; i < dzielnik; i++)
            {
                object stos =  SJF_przet.Dequeue();
                int liczba = (int)stos;                       // Tutaj wywala blad o invalid cast
                SJF_przet_tab[i] = liczba;
            }

            for (int i = 0; i < dzielnik; i++)
            {
                dzielna += SJF_przet_tab[i];
            }

            float wynik = dzielna / dzielnik;

            SjfCPS.Text = wynik.ToString();

            for (int i = 0; i < dzielnik; i++)
            {
                SJF_przet.Enqueue(SJF_przet_tab[i]);
            }

Co lepsze ten kod:

Queue tablica = new Queue();

            tablica.Enqueue(500);

            object wy =  tablica.Dequeue();
            int wy2 = (int)wy;
            int wy3 = 25 + wy2;

            MessageBox.Show(wy3.ToString());

działa, ale jak sie go wrzuci do petli przestaje działać.
Może ktoś kto ma większa wiedze merytoryczną od mojej potrafi dostrzec problem, albo ma inne rozwiazanie.

A jakby użyc do tego List<int> ?

0

Już wiem lepiej użyć List<int>, mniej zachodu i działa. Dziękuje za fachową pomoc ;).

0

Ehh, użyłeś niegenerycznej kolejki System.Collections.Queue i wszystko co tam szło było pakowane / wypakowane do obiektu typu Object.

Spróbuj użyć Queue<int> kolejka = new Queue<int>();

0
Deti napisał(a)

Ehh, użyłeś niegenerycznej kolejki System.Collections.Queue i wszystko co tam szło było pakowane / wypakowane do obiektu typu Object.

Spróbuj użyć Queue<int> kolejka = new Queue<int>();

To wiem że jest pakowane do typu object, poczytałem troche wcześniej msdn zanim napisaniem posta. Co nie zmiania faktu, że jeśli wsadzam tam int to konwersja na int jest dozwolona (według msdn) i działa raz albo dwa potem przestaje i wywala błąd. Lepszym rozwiazaniem jest zastosowanie List<int> potem nie trzeba tego wrzucac do kolejki z powrotem, kod oczywiście też jest dużo krótszy i mniej skomplikowany.

           List<int> SJF_przet = new List<int>();
           // w innej cześci kodu jest ta lista uzupełniana

            float dzielna = 0;

            for (int i = 0; i < SJF_przet.Count; i++)
            {
                dzielna += SJF_przet[i];
            }

            float wynik = dzielna / SJF_przet.Count;

            SjfCPS.Text = Zaokraglij(wynik).ToString();

PS. W moim pierwszym poście w drugiej ramce z kodem jest kod który działa i nie ma tam Queue<int> :]

0

Proponuje w ogóle uprościć:

using System.Linq;

List<int> SJF_przet = new List<int>();
// w innej cześci kodu jest ta lista uzupełniana
double wynik = SJF_przet.Average();
SjfCPS.Text = System.Math.Round(wynik, 2);

1 użytkowników online, w tym zalogowanych: 0, gości: 1