foreach-Schleife: aktuelles Listenelement überspringen
Moderator: Co-Administratoren
-
- Beiträge: 10660
- Registriert: 21.09.2012, 08:09
- System: CCU
- Wohnort: Stuttgart
- Hat sich bedankt: 321 Mal
- Danksagung erhalten: 501 Mal
foreach-Schleife: aktuelles Listenelement überspringen
Hallo,
mit "quit" kann man bekanntlich aus einem Skript aussteigen und mit "break" kann man eine Schleife abbrechen. Ich suche aber gerade eine Möglichkeit, nur die aktuelle Schleifeniteration abzubrechen und zur nächsten Iteration zu springen. Also z.B. in einer foreach-Schleife das aktuelle Listenelement zu überspringen, um direkt zum nächsten zu gelangen.
Gibt es da was?
mit "quit" kann man bekanntlich aus einem Skript aussteigen und mit "break" kann man eine Schleife abbrechen. Ich suche aber gerade eine Möglichkeit, nur die aktuelle Schleifeniteration abzubrechen und zur nächsten Iteration zu springen. Also z.B. in einer foreach-Schleife das aktuelle Listenelement zu überspringen, um direkt zum nächsten zu gelangen.
Gibt es da was?
CCU3 mit stets aktueller FW und den Addons "CUxD" und "Programmedrucken", ioBroker auf Synology DiskStation DS718+ im Docker-Container;
einige Projekte: zentrales Push-Nachrichten-Programm zPNP, DoorPi-Videotürsprechanlage, An- und Abwesenheitsdetektion per Haustürschloss, zentrales Programm zur Steuerung von Beschattungsgeräten zBSP.
einige Projekte: zentrales Push-Nachrichten-Programm zPNP, DoorPi-Videotürsprechanlage, An- und Abwesenheitsdetektion per Haustürschloss, zentrales Programm zur Steuerung von Beschattungsgeräten zBSP.
- Black
- Beiträge: 5480
- Registriert: 12.09.2015, 22:31
- System: Alternative CCU (auf Basis OCCU)
- Wohnort: Wegberg
- Hat sich bedankt: 424 Mal
- Danksagung erhalten: 1074 Mal
- Kontaktdaten:
Re: foreach-Schleife: aktuelles Listenelement überspringen
Die aktion innerhalb der Schleife in einem If kapsel vllt ?
was ist denn der konkrete case bei dir ?
Black
was ist denn der konkrete case bei dir ?
Black
Wenn das Fernsehprogramm immer mehr durch nervende Werbung unterbrochen wird und der Radiomoderator nur noch Müll erzählt, ist es besser, die Zeit für sinnvolle Dinge zu nutzen -
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg
Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann
Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W
technical contribution against annoying advertising
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg
Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann
Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W
technical contribution against annoying advertising
-
- Beiträge: 10660
- Registriert: 21.09.2012, 08:09
- System: CCU
- Wohnort: Stuttgart
- Hat sich bedankt: 321 Mal
- Danksagung erhalten: 501 Mal
Re: foreach-Schleife: aktuelles Listenelement überspringen
Es geht um mein Rollladenskript zBSS. Da kann ich unter anderem das gesamte Gewerk "Beschattung" durchlaufen, möchte aber die Option geben, Markisen hiervon auszunehmen.
Aber gerade, wo ich das hier schreibe, ist mir die Idee gekommen, an anderer Stelle anzugreifen, nämlich bei der Erzeugung der Geräteliste des Gewerks. Hier kann ich recht simpel nach Markisen fragen, um diese auszuschließen.
Der Schnipsel sieht dann so aus:
Irgendwie komme mir die Ideen in letzter Zeit immer, wenn ich mit dir drüber diskutiere. Scheinst nen guten Einfluss auf meine Gedanken zu haben.
Nichtdestotrotz fände ich aber eine Option als Ergänzung zu "quit" und "break" schön, mit der man in einer Schleife zum nächsten Element springen kann. Also z.B. ein "jump" oder dergleichen.
Aber gerade, wo ich das hier schreibe, ist mir die Idee gekommen, an anderer Stelle anzugreifen, nämlich bei der Erzeugung der Geräteliste des Gewerks. Hier kann ich recht simpel nach Markisen fragen, um diese auszuschließen.
Der Schnipsel sieht dann so aus:
Code: Alles auswählen
string blindsTrade = "Beschattung";
boolean exAwningsFlag = true;
string blindsList = ""; string blindChannel; string blindChannelsList; string blindNew; string blindOld;
blindChannelsList = (dom.GetObject(ID_FUNCTIONS).Get(blindsTrade)).EnumUsedNames();
foreach(blindChannel, blindChannelsList){
blindNew = dom.GetObject(((dom.GetObject(ID_CHANNELS).Get(blindChannel)).Device())).Name();
if((blindNew.Contains(anwningsIndicator)) && exAwningsFlag){blindNew = "";}
if(blindNew && (blindOld != blindNew)){blindsList = blindsList#blindNew#"\t";}
blindOld = blindNew;
}
blindsList = blindsList.Trim();
Nichtdestotrotz fände ich aber eine Option als Ergänzung zu "quit" und "break" schön, mit der man in einer Schleife zum nächsten Element springen kann. Also z.B. ein "jump" oder dergleichen.
CCU3 mit stets aktueller FW und den Addons "CUxD" und "Programmedrucken", ioBroker auf Synology DiskStation DS718+ im Docker-Container;
einige Projekte: zentrales Push-Nachrichten-Programm zPNP, DoorPi-Videotürsprechanlage, An- und Abwesenheitsdetektion per Haustürschloss, zentrales Programm zur Steuerung von Beschattungsgeräten zBSP.
einige Projekte: zentrales Push-Nachrichten-Programm zPNP, DoorPi-Videotürsprechanlage, An- und Abwesenheitsdetektion per Haustürschloss, zentrales Programm zur Steuerung von Beschattungsgeräten zBSP.
- Black
- Beiträge: 5480
- Registriert: 12.09.2015, 22:31
- System: Alternative CCU (auf Basis OCCU)
- Wohnort: Wegberg
- Hat sich bedankt: 424 Mal
- Danksagung erhalten: 1074 Mal
- Kontaktdaten:
Re: foreach-Schleife: aktuelles Listenelement überspringen
vllt auch noch ein kleiner Ansatzpunkt, was ich gerne mache, wenn ich mit temporären listen arbeite. (Im SDV bei der JSON generierung auchimmer intensiv genutzt.)
du generierst dir ein ENUM Object. object oENUM= dom.CreateObject (OT_ENUM,"sdvgeneratet_dtp");
gib dem ding halt nur einen aussagefähigen namen, sollte es mal als leiche verbleibe, der SDV wirds finden und wenn du den namen siehts, weist du dann auch sofort, dass es eine leiche ist und weg kann.
danach gehst du du deine generierschleife hindurch, aber anstatt nun jedesmal etwas an einen string anzufügen, fügst zu z.b, die ID mit oENUM.Add (ID); diesem Enum Object hinzu.
wenn du eine ID daraus entfernen willst, dann oENum.Remove (ID);
das gute ist, du musst nicht auf doppelt und so achten.
am ende wenn du fertig bist, kann du
z.b.mit Count die Anzahl der objecte Abfragen oEnum.Count ()
oder einmach mit foreach (sEnum,oEnum.EnumIDs () ) {
}
über deine Liste iterieren.
am ende halt nur nicht vergessen, das Enum Object wieder zu elimineiren.
Black
dom.DeleteObject (oEnum);
du generierst dir ein ENUM Object. object oENUM= dom.CreateObject (OT_ENUM,"sdvgeneratet_dtp");
gib dem ding halt nur einen aussagefähigen namen, sollte es mal als leiche verbleibe, der SDV wirds finden und wenn du den namen siehts, weist du dann auch sofort, dass es eine leiche ist und weg kann.
danach gehst du du deine generierschleife hindurch, aber anstatt nun jedesmal etwas an einen string anzufügen, fügst zu z.b, die ID mit oENUM.Add (ID); diesem Enum Object hinzu.
wenn du eine ID daraus entfernen willst, dann oENum.Remove (ID);
das gute ist, du musst nicht auf doppelt und so achten.
am ende wenn du fertig bist, kann du
z.b.mit Count die Anzahl der objecte Abfragen oEnum.Count ()
oder einmach mit foreach (sEnum,oEnum.EnumIDs () ) {
}
über deine Liste iterieren.
am ende halt nur nicht vergessen, das Enum Object wieder zu elimineiren.
Black
dom.DeleteObject (oEnum);
Wenn das Fernsehprogramm immer mehr durch nervende Werbung unterbrochen wird und der Radiomoderator nur noch Müll erzählt, ist es besser, die Zeit für sinnvolle Dinge zu nutzen -
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg
Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann
Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W
technical contribution against annoying advertising
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg
Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann
Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W
technical contribution against annoying advertising
-
- Beiträge: 272
- Registriert: 03.10.2014, 12:46
- System: CCU
- Wohnort: Enzkreis
- Hat sich bedankt: 3 Mal
- Danksagung erhalten: 43 Mal
Re: foreach-Schleife: aktuelles Listenelement überspringen
lt. HM-Skript_Teil_1_Sprachbeschreibung_V2.3.pdf https://www.eq-3.de/service/downloads.html?id=58, S. 11:
Wie die „while“-Schleife, lässt sich auch die „foreach“-Schleife mittels „break“-Befehl beenden oder mittels „continue“-Befehl fortsetzen.
-
- Beiträge: 10754
- Registriert: 24.02.2011, 01:34
- System: CCU
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 673 Mal
Re: foreach-Schleife: aktuelles Listenelement überspringen
oder auch so:
Alchy
Alchy
Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.
© Sandra Pulsfort (*1974)
Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.
Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.
- jmaus
- Beiträge: 9862
- Registriert: 17.02.2015, 14:45
- System: Alternative CCU (auf Basis OCCU)
- Wohnort: Dresden
- Hat sich bedankt: 464 Mal
- Danksagung erhalten: 1880 Mal
- Kontaktdaten:
Re: foreach-Schleife: aktuelles Listenelement überspringen
Ja, einfach als Statement "continue" nehmen. Das habe ich seinerzeit zusammen mit break der ReGaHss beigebracht. Geht für sämtliche Schleifenvarianten der ReGaHss (foreach, while, etc.).dtp hat geschrieben: ↑21.05.2020, 11:24mit "quit" kann man bekanntlich aus einem Skript aussteigen und mit "break" kann man eine Schleife abbrechen. Ich suche aber gerade eine Möglichkeit, nur die aktuelle Schleifeniteration abzubrechen und zur nächsten Iteration zu springen. Also z.B. in einer foreach-Schleife das aktuelle Listenelement zu überspringen, um direkt zum nächsten zu gelangen.
Gibt es da was?
RaspberryMatic 3.75.7.20240420 @ ProxmoxVE – ~200 Hm-RF/HmIP-RF/HmIPW Geräte + ioBroker + HomeAssistant – GitHub / Sponsors / PayPal /
-
- Beiträge: 10660
- Registriert: 21.09.2012, 08:09
- System: CCU
- Wohnort: Stuttgart
- Hat sich bedankt: 321 Mal
- Danksagung erhalten: 501 Mal
Re: foreach-Schleife: aktuelles Listenelement überspringen
Danke. Den "continue"-Befehl hatte ich tatsächlich übersehen. Die Bezeichnung finde ich jedoch etwas unglücklich, weil ich "continue" eher mit einem Weiterführen nach einer Unterbrechung als mit einem Springen zum nächsten Listenelement bzw. zum nächsten Schleifenschritt verbinde. Nun ja, Namen sind bekanntlich Schall und Rauch.
CCU3 mit stets aktueller FW und den Addons "CUxD" und "Programmedrucken", ioBroker auf Synology DiskStation DS718+ im Docker-Container;
einige Projekte: zentrales Push-Nachrichten-Programm zPNP, DoorPi-Videotürsprechanlage, An- und Abwesenheitsdetektion per Haustürschloss, zentrales Programm zur Steuerung von Beschattungsgeräten zBSP.
einige Projekte: zentrales Push-Nachrichten-Programm zPNP, DoorPi-Videotürsprechanlage, An- und Abwesenheitsdetektion per Haustürschloss, zentrales Programm zur Steuerung von Beschattungsgeräten zBSP.
-
- Beiträge: 10754
- Registriert: 24.02.2011, 01:34
- System: CCU
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 673 Mal
Re: foreach-Schleife: aktuelles Listenelement überspringen
Kannst du bitte etc. diesbezüglich näher beschreiben?
Alchy
Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.
© Sandra Pulsfort (*1974)
Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.
Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.
- jmaus
- Beiträge: 9862
- Registriert: 17.02.2015, 14:45
- System: Alternative CCU (auf Basis OCCU)
- Wohnort: Dresden
- Hat sich bedankt: 464 Mal
- Danksagung erhalten: 1880 Mal
- Kontaktdaten:
Re: foreach-Schleife: aktuelles Listenelement überspringen
Na wenn du „break“ und „continue“ als unglücklich gewählt ansiehst dann hast du anscheinend noch nie C Programmierung betrieben. Da heissen diese Statements nämlich auch und IMHO ergeben diese Namen durchaus Sinn.dtp hat geschrieben: ↑24.05.2020, 11:36Die Bezeichnung finde ich jedoch etwas unglücklich, weil ich "continue" eher mit einem Weiterführen nach einer Unterbrechung als mit einem Springen zum nächsten Listenelement bzw. zum nächsten Schleifenschritt verbinde. Nun ja, Namen sind bekanntlich Schall und Rauch.
RaspberryMatic 3.75.7.20240420 @ ProxmoxVE – ~200 Hm-RF/HmIP-RF/HmIPW Geräte + ioBroker + HomeAssistant – GitHub / Sponsors / PayPal /