Avatar billede vivaa.dk Nybegynder
25. januar 2008 - 13:41 Der er 6 kommentarer og
1 løsning

Placere tal i intervaller

Halløj..

Jeg har en samlet collection af nogle nummerobjekter. hver nummberobjekt har tilknyttet en DateTime.

Disse nummerobjekter skal jeg nu have gennemløbet så de placeres i intervaller på et kvarter.

Fx det samlede antal fra 0 til kl. 0.15 og det næste interval er fra 0.15 til 0.30 osv.

MEN hvis antallet er 0 skal intervallet slet ikke være oprettet, eksisterer intervallet ikke i den nye collection, skal det oprettes hvis der skal placeres et nummer i det.

Der kan i øvrigt være flere datoer i nummercollection, så datoerne er også vigtige at kunne adskille på.

I sidste ende skal min intervalListe kunne blive en liste med FraTid TilTid og samlet antal i intervallet.

Hvordan får jeg lavet dette gennemløb fra den ene liste til den anden, smartest muligt?

Hvis jeg har skrevet det for kryptisk må i sige til, så skal jeg prøve at sige det på en anden måde.
Avatar billede arne_v Ekspert
25. januar 2008 - 18:50 #1
Til inspiration:

using System;
using System.Collections;

namespace E
{
    public class Interval : IComparable
    {
        private DateTime start;
        private int minutes;
        private int no;
        public Interval(DateTime start, int minutes)
        {
            this.start = start;
            this.minutes = minutes;
            no = 1;
        }
        public void IncrNo()
        {
            no++;
        }
        public override string ToString()
        {
            return "[" + start.ToString() + "-" + start.AddMinutes(minutes).ToString() + ": " + no + "]";
        }
        public int CompareTo(object o)
        {
            return (int)(start.Ticks - ((Interval)o).start.Ticks);
        }
    }
    public class IntervalList
    {
        private Hashtable list;
        private int minutes;
        public IntervalList(int minutes)
        {
            list = new Hashtable();
            this.minutes = minutes;
        }
        public void Add(DateTime dt)
        {
            DateTime start = new DateTime(dt.Ticks - dt.Ticks % (minutes * 60 * 10000000L));
            if(list.ContainsKey(start))
            {
                ((Interval)list[start]).IncrNo();
            }
            else
            {
                list.Add(start, new Interval(start, minutes));
            }
        }
        public IList GetIntervals()
        {
            ArrayList res = new ArrayList(list.Values);
            res.Sort();
            return res;
        }
    }
    public class MainClass
    {
        public static void Main(string[] args)
        {
            IntervalList ivlist = new IntervalList(15);
            ivlist.Add(new DateTime(2007, 1, 25, 12, 29, 0));
            ivlist.Add(new DateTime(2007, 1, 25, 12, 30, 0));
            ivlist.Add(new DateTime(2007, 1, 25, 12, 31, 0));
            foreach(Interval iv in ivlist.GetIntervals())
            {
                Console.WriteLine(iv);
            }
        }
    }
}
Avatar billede arne_v Ekspert
25. januar 2008 - 18:50 #2
Beklager at det er uden generics.
Avatar billede vivaa.dk Nybegynder
29. januar 2008 - 08:21 #3
Takker.. Jeg lige lige lidt på det :)
Avatar billede vivaa.dk Nybegynder
29. januar 2008 - 09:35 #4
Jeg har rettet den lidt til, da jeg gerne i fremtiden vil have mulighed for at nummeret kan variere..

Så IncrNr har jeg sat til IncrNr(int no) og sørget for at den er nødvendig for at skabe et objekt af et interval.

Men nu får jeg følgene fejl ved res.Sort();

InvalidOperationException unhandled
Sammenligning af to elementer i arrayet mislykkedes.

Jeg går ud fra problemet måske ligger i at flere intervaller har tallet 1, hvilket jo gerne skulle kunne være muligt.

Hvordan klarer jeg den?
Avatar billede vivaa.dk Nybegynder
29. januar 2008 - 09:40 #5
Nå det er ikke numrene den er gal med..

Så ved jeg ikke hvorfor den gør det..
Avatar billede vivaa.dk Nybegynder
29. januar 2008 - 10:01 #6
lige meget.. Sort er ligegyldig for mig, ved nærmere eftertanke..

Takker for en super hjælp.. :)

Smid svar for points..
Avatar billede arne_v Ekspert
29. januar 2008 - 15:24 #7
OK
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester