Pętla dla wyświetlania zawartości wielu obiektów.

0

Witam.
Na wstępie: Uczę się, więc traktujcie mnie jak zielonego. Szukałem wiele i nie znalazłem, stąd mój post.

Stworzyłem proste klasy, załóżmy, że coś w tym stylu (tylko poglądowo)

public class Module
{
    public string model;
    public int digIn;
    public int digOut;
}

Dalej tworzymy obiekty, załóżmy, że trzy przykładowe:

Module Module1 = new Module();
Module1.model = "8/8";                        
Module1.digIn = 8;                                
Module1.digOut = 8;                        

Module Module2 = new Module();
Module2.model = "8/4";                        
Module2.digIn = 8;                                
Module2.digOut = 4;

Module Module3 = new Module();
Module3.model = "2/2";                        
Module3.digIn = 8;                                
Module3.digOut = 4;

I teraz chciałbym użyć np. pętli for do wyświetlenia zawartości wszystkich lub wybranych pozycji.
Pytanie brzmi: W jaki sposób wywołać Console.Writeline(), aby móc wyświetlić kilka obiektów kolejno?
Chodzi o to, by móc zmieniać numer za "Module" i wyświetlać je np. za pomocą inkrementacji lub wybierać kolejno z tabeli.
Coś w stylu:

for(i=0,i<3, i++)
{
  Console.Writeline(ModuleX.model)  // POD "X" miałaby się znaleźć podstawiana wartość zmienna i,
}

Ogólnie chodzi o to, aby można było manipulować zmiennymi wewnątrz Console.Writeline(), ale chciałbym uniknąć kombinowania ze stringami, bo program będzie co chwila obrabiał kolejne obiekty, zmieniał je, wyświetlał i tak w koło, więc szkoda pamięci, stąd wolę zmieniać numer na końcu.
Szczerze to nawet nie wiem pod jakimi hasłami tego szukać i błądzę.
Dziękuję za pomoc i pozdrawiam.

2

Nie przepisuj tych obiektów do zmiennych, tylko dodaj je do listy i potem przeliteruj pętlą for po liście, odwołując się do indeksow. Możesz też użyć pętli foreach ,będzie prościej.

0
kzkzg napisał(a):

Nie przepisuj tych obiektów do zmiennych, tylko dodaj je do listy i potem przeliteruj pętlą for po liście, odwołując się do indeksow. Możesz też użyć pętli foreach ,będzie prościej.

Tylko w późniejszych krokach zamierzam sporo tu namieszać. Zamysł jest taki: Użytkownik dodaje sobie kolejne moduły do projektu, w trakcie je edytuje, usuwa, zmienia itp.
Z wyświetleniem listy wszystkich nie ma problemu, ale później zamierzam np. zliczać wartości zmiennych digIn ze wszystkich modułów, innym razem tylko z wybranych, wyświetlać część modułów (np. tylko danego rodzaju itp.). Ostatecznie zapisywać do pliku i odczytywać z niego. Pytanie czy lista tu się spisze? Bo jeśli mógłbym np. uzależnić pętlę od tego, czy w danym obiekcie zmienna digIn jest większa od 0, to znacznie by to ułatwiło. Ogólnie chodziłoby o to, aby wewnątrz nawiasów Console.Writeline() móc co chwila, na bieżąco zmieniać nazwę zmiennej.

Pytanie czy spisałoby się coś w stylu:
Pętla z inkrementacją leci po całej liście, a wewnątrz niej "if" filtruje wybrane parametry?

1
    public class Module
    {
        public string model;
        public int digIn;
        public int digOut;
    }

    public static List<Module> modules = new List<Module>()
    {
        new Module() { model="8/8", digIn=8, digOut=8 },
        new Module() { model="8/4", digIn = 8, digOut = 4 },
        new Module() { model="2/2", digIn = 2, digOut = 2 },
    };

    public static void Main(string[] args)
    {
        foreach(Module module in modules) Console.Write(module.model+" ");
        Console.WriteLine();
        modules.Where(m => (m.digOut <= 4)).Select(m => m.model).ToList().ForEach(m => Console.Write(m+" "));
        Console.WriteLine();
        modules.Where(m => (m.digOut == 2)).Select(m => m.model).ToList().ForEach(m => Console.Write(m + " "));
        Console.WriteLine();
    }
1

Pytanie czy spisałoby się coś w stylu:
Pętla z inkrementacją leci po całej liście, a wewnątrz niej "if" filtruje wybrane parametry?

Ja w tym odczytuję zły projekt struktury danych - ale nie ujawniasz szczeółów.
A już pętla z inkrementacją ... -> obok jest wątek, może zbytnio profesjonalny, albo hipsterski, ale jest: "czy pętla for to obciach"
Po kontenerach (skądinad - pojecie, którego ci bardzo brakuje) można chodzić bardziej elegancką pętlą foreach

kzkzg napisał(a):

Nie przepisuj tych obiektów do zmiennych, tylko dodaj je do listy i potem przeliteruj pętlą for po liście, odwołując się do indeksow. Możesz też użyć pętli foreach ,będzie prościej.

+1 , aczkolwiek poniżej

Dominik Woźniak napisał(a):
kzkzg napisał(a):

Ogólnie chodziłoby o to, aby wewnątrz nawiasów Console.Writeline() móc co chwila, na bieżąco zmieniać nazwę zmiennej.

Dynamiczna, dostępna na wykonaniu "nazwa zmiennej", to najczęściej oznacza ,że człowiek potrzebuje Dictionary (w innych językach zwane Map). Niestety szczegółów mało.

@Dominik Woźniak:

Rozumiem że się uczysz, ale metoda "bardzo chcę" nie prowadzi do dobrych wyników.

Zredukuj trochę ten zamiar, uzupełnij podstawy, przerób porządny kurs / podręcznik języka , z kontenerami danych (List, Dictionary, Set), z pogłębionym programowaniem obiektowym (np jak w spsob napisac wartościowy konstruktor).

Piszesz o "jakimś" zróżnicowaniu obiektów, nie da się zgadnąć który sens "zróżnicowania" przykładasz. Z jednej strony mogą to być obiekty tej samej klasy (ale bez oszustwa) różniące się tylko atrybutem (imię psa, kolor ubrania), z drugie różniące sie "charakterem" - podstawy dziedziczenia czy implementowania interfejsów (Jabłko, Pomarańcza JEST Owocem, ale Jabłko nie jest Pomarańczą)

Niestety, na tym etapie wiedzy i metoda "bardzo chcę", najgorsze co może Ci się zdarzyc, to że "się uda". Potem sam sobie udowodnisz, że "przecież jest dobrze i działa" - jak nauczyć się źle pływac czy grać na gitarze - bardzo dużo energii kosztuje, albo wielu wcale sie nie uda - przeuczyć na "dobrze grać" czy "dobrze pływać"

0
Dominik Woźniak napisał(a):
kzkzg napisał(a):

Zamysł jest taki: Użytkownik dodaje sobie kolejne moduły do projektu, w trakcie je edytuje, usuwa, zmienia itp.

Właśnie. jednym z celów dobrego programowania obiektowego, i środków do tego, aby było wysokiej jakości, jest dobra NAZWA. My nie wiemy, co myślisz, jak mówisz Moduł,. i co myślisz, jak mówisz "kolejny". Mnie pika negatywne przewidywanie co do pól obiektu, mam tzw przeczucia

Z wyświetleniem listy wszystkich nie ma problemu, ale później zamierzam np. zliczać wartości zmiennych digIn ze wszystkich modułów, innym razem tylko z wybranych, wyświetlać część modułów (np. tylko danego rodzaju itp.). Ostatecznie zapisywać do pliku i odczytywać z niego. Pytanie czy lista tu się spisze? Bo jeśli mógłbym np. uzależnić pętlę od tego, czy w danym obiekcie zmienna digIn jest większa od 0, to znacznie by to ułatwiło. Ogólnie chodziłoby o to, aby wewnątrz nawiasów Console.Writeline() móc co chwila, na bieżąco zmieniać nazwę zmiennej.

Tu właśnie odsłania, ze brakuje szczęśliwego projektu (może oznaczać wszytko albo nic) - a szczęściu trzeba sprzyjać przez wiedzę. Na tym etapie brak podstawowych konceptów, to nt wykonania trudno coś sie z optymizmem spodziewać

0
ZrobieDobrze napisał(a):

Niestety, na tym etapie wiedzy i metoda "bardzo chcę", najgorsze co może Ci się zdarzyc, to że "się uda". Potem sam sobie udowodnisz, że "przecież jest dobrze i działa" - jak nauczyć się źle pływac czy grać na gitarze - bardzo dużo energii kosztuje, albo wielu wcale sie nie uda - przeuczyć na "dobrze grać" czy "dobrze pływać"

Spokojnie, nie jestem z tych co bardzo chcą, skopiują gotowy kod i polecą dalej. Mój projekt jest taki: Napisać konkretny program do konkretnych rzeczy. Najpierw sprawić, aby działał w konsoli na pamięci RAM, później dodać operacje na plikach, później stworzyć do tego interfejs graficzny. Jestem tym typem, któremu nic nie daje czytanie książek, przewalanie stert wyjaśnień jak działa dana metoda itp. U mnie działa: Po co? Dlaczego? Muszę mieć żywy organizm, na którym będzie widać sens wykorzystania. Pamiętam pierwsze zajęcia z podstaw programowania na studiach - katorga. Suche dane bez konkretnych przykładów z życia - nie widziałem sensu i byłem tam za karę. Po latach jest całkiem inaczej, bo widzę cel. Dlatego właśnie uczę się na programie według swojego projektu i nie - nie chodzi o to, żeby ktoś mi dał gotowy kod, który skopiuję i na tym koniec. Wręcz odwrotnie - oczekuję bardziej sugestii jak to można zrobić - i wówczas właśnie sięgam do odpowiednich zagadnień w książkach i kursach. Zależy mi, żeby zrozumieć jak to działa, dlaczego tak się dzieje i jak to można wykorzystać.

Co do samego programu: Moduł nie jest modułem w sensie informatycznym, ale dosłownie fizycznym modułem elektrycznym. Podałem tylko wycinek kodu, przykładowy, aby przekazać klu problemu. W docelowym programie klas jest więcej i są dużo bardziej rozbudowane. Każdy nowo dodany moduł elektryczny ma pewną liczbę wejść i wyjść cyfrowych, analogowych, interfejsów 1-wire, rs-232, rs-485, swoją nazwę, opis, pobór prądu i tak dalej.
Ogólny zamysł jest taki: użytkownik otwiera program, dodaje jeden z predefiniowanych modułów elektrycznych o określonych parametrach lub moduł niestandardowy. Może wyświetlić parametry każdego modułu z osobna, edytować je i tak dalej, ostatecznie może je filtrować, sortować po wejściach, wyjściach takich czy innych, nazwach, rodzajach itd. Na koniec zlicza ilość wejść/wyjść i porównuje to z ilością elementów sterujących i sterowanych (fizycznych, np. żarówek, czujników itp.), informując użytkownika, czy przypadkiem czegoś nie brakuje itd.

W pytaniu chodziło o to, by Koledzy z doświadczeniem podpowiedzieli w jakich kierunkach można pójść. Ktoś podpowiedział listy - i teraz kopię na temat list zarówno w książkach, internecie jak i kursach płatnych. Widzę dla nich konkretne zastosowanie więc uczę się tego. Jak już to zrozumiem i odpowiednio zaimplementuję w programie - przejdę do następnego kroku, ale najpierw rozwiążę ten problem i go przetestuję różnymi metodami.

Co do analogii z gitarą: Nie chcę uczyć się na książkach, bo sama teoria bez praktyki nie dla mnie - szybko zapomnę. Zacznę od celu - grać tak, żeby to brzmiało. A skoro chcę grać, pytam tu co mogę zrobić. Ktoś podpowiada zagraj akord C - okej, szukam jak to się robi, uczę się tego akordu. Tak mi łatwiej, bo mam konkretny cel, który osiągam krokami.

1
Dominik Woźniak napisał(a):

Jestem tym typem, któremu nic nie daje czytanie książek, przewalanie stert wyjaśnień jak działa dana metoda itp. U mnie działa: Po co? Dlaczego? Muszę mieć żywy organizm, na którym będzie widać sens wykorzystania.

I tu widzę problem. Programowanie na normalnym (profesjonalnym / eleganckim) poziomie to abstrakcje. jest skrajnie mało prawdopodobne, aby samemu to odkryć "własnymi paluchami". Niestety, nie ma innego sposobu, niż przyjąć "na wiarę", teoretycznie , abo potem najpierw nieudolnie, potem lepiej zastosować.

Niestety, już widzę, z "obrażeniem na teorię" ogromny rozdzwięk. Niby mówisz jak ktoś uprawiajacy programowanie od lat, ale brak List to brak nie finezji (na poziomie wysoko abstrakcyjknego programowania jak 10 letni zawodowiec), a elementarza. Ogromnie dużo czasu zmarnujesz ze swoją filozofią

Przypominasz mi miszczów delphi, którzy nie znają koncepcji zmiennej (a kontenery/zmienne złożone to hoho), i kładą niewidzialne textboxy albo listboxy (bo to jest myszką osiagalne)

0
ZrobieDobrze napisał(a):

I tu widzę problem. Programowanie na normalnym (profesjonalnym / eleganckim) poziomie to abstrakcje. jest skrajnie mało prawdopodobne, aby samemu to odkryć "własnymi paluchami".
Niestety, nie ma innego sposobu, niż przyjąć "na wiarę", teoretycznie , abo potem najpierw nieudolnie, potem lepiej zastosować.

Nie tak. Teoria ok, ale łatwiej mi od razu uczyć się na przykładach, do których mi bliżej. Łatwiej będzie, jeśli ma się cel, a nie według akademickich wytycznych. Nie odkrywam własnymi paluchami - po prostu mój program ma mi ułatwić. Jak napisałem - ktoś pisze o listach, to teraz nauczę się ich jak należy - począwszy od teorii, przez kursy aż do zastosowania. Dodam, że ten program nie ma być po prostu napisany. On ma być moją metodą nauki, na którym przetestuję różne możliwości, by się ich nauczyć. Tu nie chodzi o to, by po prostu go napisać, żeby działał. Jest moją metodą na zrozumienie szczątkowych zagadnień. To nie jest coś co chcę napisać i na tym koniec.

ZrobieDobrze napisał(a):

Niestety, już widzę, z "obrażeniem na teorię" ogromny rozdzwięk.

Nie - teoria tak, ale bliżej znanych mi zastosowań, żeby nie tłuc jej bezcelowo. Teraz właśnie zagłębiam się w teorię działu, który Koledzy podpowiedzieli

ZrobieDobrze napisał(a):

Niby mówisz jak ktoś uprawiajacy programowanie od lat, ale brak List to brak nie finezji (na poziomie wysoko abstrakcyjknego programowania jak 10 letni >zawodowiec), a elementarza. Ogromnie dużo czasu zmarnujesz ze swoją filozofią

Znów Nie - nie napisałem, że się tym zajmuję. Napisałem o zderzeniu ze złym podejściem nauczyciela lata temu na studiach (dopowiem, że nie były to studia informatyczne a Elektrotechnika). Nie jestem programistą. Jeszcze nie. Być może będę, może nie - na razie nie ma to większego znaczenia. Na razie mam cel: Zrozumieć C# i dobrze się przy tym bawić. Z programowaniem miałem do czynienia na studiach na tyle, by zaliczyć przedmiot. Później lata nic, później trochę C++ hobbystycznie z arduino i to mi się podobało. Trochę skryptów LUA do systemów, którymi się zajmuję zawodowo, ale raczej bazujących na prostych warunkach i pętlach. Teraz kolej na C#, bo mi się to podoba. Odkrywam nowe rzeczy, dobrze się przy tym bawię i mam cel - nauczyć się. Na razie tyle. A czy kiedyś zajmę się tym zawodowo? Może tak, jeśli okaże się, że to dla mnie a może nigdy. Nie jestem jednym z tych, którzy ze względu na słaby rynek w swoim zawodzie na siłę zmienia branżę lub chce więcej zarabiać. Na tą chwilę, gdybym nawet miał wiedzę wystarczającą na zostanie Juniorem, finansowo bym stracił dość sporo. Weź też pod uwagę proszę, że na różnych ludzi lepiej działają takie metody nauki, na innych inne. Dla mnie bez sensu jest kuć teorię tylko dlatego, że tak trzeba, bo będzie mnie to męczyć. Dla mnie teoria ma sens, kiedy jest potrzebna. Mi są potrzebne teraz listy, foreach itp. więc na tym się teraz skupię, ale nie na tyle, by mi zadziałało w tym konkretnym programie i na tym koniec, ale na tyle, by to zrozumieć. W ten sposób tego działu teorii nauczę się w bardziej przystępny dla mnie sposób. I tak jak Ty optymalizujesz swój kod, tak jak optymalizuję swoją naukę, bo póki co traktuję to jako ciekawą i pożyteczną przyjemność, która być może stanie się kiedyś moim zawodem, ale zupełnie nie mam na to ciśnienia.

Przypominasz mi miszczów delphi, którzy nie znają koncepcji zmiennej (a kontenery/zmienne złożone to hoho), i kładą niewidzialne textboxy albo listboxy (bo to jest myszką osiagalne)

W zasadzie nieistotne kogo przypominam, bo dysponujesz szczątkową ilością danych a lecisz z osądami z grubej rury. Zrozum więc:
Na bazie programu chcę się uczyć w bardziej przystępny dla mnie sposób. Mogę lecieć teorię i robić na siłę to, co mnie nie interesuje lub połączyć teorię ze znaną mi rzeczywistością i zrobić z tego przyjemność, którą będę się fascynował, dla której bedę widział sens i czekał na kolejne godziny przed klawiaturą - stąd koncepcja z moim programem.

0
Dominik Woźniak napisał(a):

Dla mnie teoria ma sens, kiedy jest potrzebna. Mi są potrzebne teraz listy, foreach itp. więc na tym się teraz skupię, ale nie na tyle, by mi zadziałało w tym konkretnym programie i na tym koniec, ale na tyle, by to zrozumieć.

No właśnie dyskusyjne, czy NA PEWNO listy, i po to teoria, aby mieć szanse ocenić NAJLEPSZĄ strukturę danych do zagadnienia.
jak się zna jedną, to kiepsko, nie ma z czym porównać i często sie kończy na jedzeniu zupy widelcem.

Dominik Woźniak napisał(a):

Później lata nic, później trochę C++ hobbystycznie z arduino i to mi się podobało.

No właśnie. Arduino nie jest doszczętnie chora ideą *), ale ekosystem zdecydowanie ściąga w dól, niż pcha w górę. Naprawdę wielu "nauczyło się źle pływać", i nigdy tego nie zmieni.

*) brak namespace??? Na pewno, ale to nie tragedia.
Genetycznie przeznaczone do prostej nauki zabawek z mikrokontrolerem, a używane "w przemyśle", jakaś wada, jeśli zmieniamy kontekst, zupełny brak sprawdzającej się koncepcji "bilioteki" dla pracy profesjonalnej, usodtepniania i korzystania z obcego dorobku.

0
ZrobieDobrze napisał(a):

No właśnie dyskusyjne, czy NA PEWNO listy, i po to teoria, aby mieć szanse ocenić NAJLEPSZĄ strukturę danych do zagadnienia.
jak się zna jedną, to kiepsko, nie ma z czym porównać i często sie kończy na jedzeniu zupy widelcem.

Zgadzam się. I dlatego jako początkujący, szukając dobrego rozwiązania na napotkany problem napisałem tutaj. Koledzy odpowiedzieli - jeden podpowiedział rozwiązanie słownie, inny wrzucił kod. I teraz mam szansę nauczyć się jak to działa w praktyce i zgłębić towarzyszącą teorię. Widzisz, teoria jest ważna, ale po 1 łatwiej się uczyć na przykładach, po 2 na razie nie mam tyle czasu, żeby zapoznać się z obszerną teorią, w tym w większości tą, której pewnie nie użyję. Dobrze jest znać dietę cukrzycową, ale jak jest się lekarzem. Na co dzień większości jest to niepotrzebne. Ale jeśli jest się cukrzykiem lub ma się takiego w rodzinie, wtedy warto poznać teorię, by móc ją wprowadzić w praktykę. Ale jednocześnie tej osobie może nie być potrzebna wiedza na temat leczenia zapalenia stawów, skoro na to nie choruje.
Poznanie szerokiej teorii ułatwia, ale czasami jest bezzasadne porównując koszt=efekt. W moim przypadku, początkującego szukającego pozytywnej w odbiorze drogi nauki cała teoria jest zbędna. Ale pisząc na tym forum miałem nadzieję na drogowskazy. Spróbuj tak, a może tak, to ma sens a to nie. Nauczę się list itp. pokombinuję z nimi i być może okaże się to właściwą drogą, aż znów uderzę w ścianę. W końcu zrobię program, który działa jak chciałem, a być może za kilka lat do niego wrócę i spojrzę na kod z politowaniem i zacznę go zmieniać. Zatem mając ograniczony czas lepiej iść za drogowskazem kogoś, kto wie i podpowie niż faszerować się teorią i się zdemotywować. Na tym etapie jestem daleki od wiedzy, która pozwoliłaby mi na ocenę czy listy będą tu odpowiednie, a jednocześnie zanim dojdę do poziomu, który pozwoli mi na trafną ocenę, mógłbym poświęcić niewspółmiernie dużo czasu. A czasem lepiej do zupy użyć widelca i wyjeść ziemniaczki i marchewkę ;)

ZrobieDobrze napisał(a):

No właśnie. Arduino nie jest doszczętnie chora ideą *), ale ekosystem zdecydowanie ściąga w dól, niż pcha w górę. Naprawdę wielu "nauczyło się źle pływać", i nigdy tego nie zmieni.

Tak, ale zawsze można od czegoś zacząć i przekonać się, czy w ogóle polubi się programowanie choćby na bazie tak topornej platformy

0
Dominik Woźniak napisał(a):
ZrobieDobrze napisał(a):

No właśnie. Arduino nie jest doszczętnie chora ideą *), ale ekosystem zdecydowanie ściąga w dól, niż pcha w górę. Naprawdę wielu "nauczyło się źle pływać", i nigdy tego nie zmieni.

Tak, ale zawsze można od czegoś zacząć i przekonać się, czy w ogóle polubi się programowanie choćby na bazie tak topornej platformy

No właśnie ... pasowało by za Piłsudskim powiedzieć, że platforma nie jest toporna, tylko ludzie ... istniejące w ekosystemie nawyki, zwyczaje i przekaz.
Adept zdecydowanie dostaje przekaz ściągający w dól, PONIŻEJ potencjału platformy.

1

@ZrobieDobrze to ma fantazje :D

każdy wątek początkujących i zaczyna się ten sam temat

ja to się w sumie dziwie że to jeszcze modzi tolerują :D

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.