aicher1998
Goto Top

CSharp Bereiche von Listen von Zahlen ausgeben

Hallo

Ich hab noch ein Problem. Ich dachte, das wäre in 5-10 Minuten erledigt, aber ich schaffe es einfach nicht...

Ich habe ein Array von Integer zum Beispiel
{ 4, 6, 7, 8, 9, 11, 14, 15, 19, 22, 23, 39}
(Das Array ist immer positiv, geht immer aufwärts und es kommt keine Zahl doppelt vor).

Ich möchte nun, dass mir das Programm folgendes ausgibt:
4
6-9
11
14-15
19
22-23
39


Folgendes habe ich mir zuerst überlegt, bin aber daran gescheitert, da es mit zu komplex geworden ist.
for (int i = 1; i<values.Count(); i++)
{
    if (values[i - 1] == values[i] - 1)//Kette geht weiter!
    {
        _to = values[i];
        if (i == values.Count()-1) listBox1.Items.Add(_from + " - " + _to);  
    }
    else //Kette unterbrochen
    {
        listBox1.Items.Add(_from + " - " + _to);  
        _from = values[i];
        if (i != values.Count()-1 && values[i] + 1 < values[i + 1])
        {
            listBox1.Items.Add(_from);
            _from = values[i + 1];
            i++;
        }
    }
}


Danach habe ich folgendes entworfen, womit ich schon zufriedener bin:


List<int> list = new List<int>() { 4, 6,7,8, 9, 11, 14,15, 19, 22, 23, 39}; // testDaten

int olddiff = 0;
string add = "";  

for (int i = 0; i<list.Count(); i++)
{
    int item = list[i];
    int diff = item - i;

    if (diff == olddiff | i == 0)
    {
        add += item + " ";  
    }
    else
    {
        if (add=="")  
        {
            listBox1.Items.Add(list[i-1]);
            add += item + " ";  
        }
        else
        {
            listBox1.Items.Add(add);
            add = "";  
        }
        
    }

    olddiff = diff;
}

(Mein Algorithmus im Code geht davon aus, dass der Abstand zwischen Index und Wert immer derselbe ist, wenn die Zahlenreihe fortgesetzt wird)

Bei letzterem sei angemerkt, dass es teilweise funktioniert.
1. Problem ist, dass es zwar bei dem Array
{ 2, 3, 4, 6, 7, 8, 9, 11, 14, 15, 19, 22, 23, 39}
funktioniert, nicht aber bei
{ 4, 6, 7, 8, 9, 11, 14, 15, 19, 22, 23, 39}
da es anscheinend nicht funktioniert, wenn die erste Zahl alleine steht und keinen "Nachbarn" hat
2. Problem ist, dass die letzte Zahl (39) nicht auftaucht.

Ich versuche das jetzt schon seit 3 Stunden und habe das vor ein paar Wochen schon einmal aufgegeben.

Ich bin sicher, dass da nur ein kleiner Verständnisfehler ist und dass es eigentlich ganz einfach ist.

Kann mir bitte jemand einen kleinen Denkanstoß geben?

Gruß
Christopher

Content-Key: 333343

Url: https://administrator.de/contentid/333343

Ausgedruckt am: 19.03.2024 um 08:03 Uhr

Mitglied: Aicher1998
Aicher1998 26.03.2017 um 23:52:26 Uhr
Goto Top
So für alle die ein ähnliches Problem haben...

Habs jetzt geschafft, es ist ein 8-Zeiler geworden, ich hab doch gewusst, dass es so einfach ist...

List<int> list = new List<int>() { 4, 6, 7, 8, 9, 11, 14, 15, 19, 22, 23, 39 };
for (int i = list; i < list[list.Count-1] + 1; i++)
{
    if (list.Contains(i))
        textBox1.AppendText(i.ToString() + " ");  
    else
        if (! textBox1.Text.EndsWith("\r\n")) textBox1.AppendText("\r\n");  
}