• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C# Dynamiczna tablica obiektów

VPS Starter Arubacloud
0 głosów
1,305 wizyt
pytanie zadane 30 grudnia 2020 w C# przez j.cob_21 Początkujący (350 p.)

Cześć,
Jestem studentem i piszę program, ale niestety kompletnie utknąłem w C# jestem kompletnie nowy dlatego też jeśli gdzieś będę miał jakieś braki lub błędy w rozumowaniu proszę o zrozumienie.

Program tworzę w visual studio (Windows Forms App) i za zadanie mam dynamicznie tworzyć obiekty za pomocą przycisku, jako ich atrybuty pobieram dane z Textboxów w których wartości wprowadza użytkownik - liczba zleceń równoległych i liniowych produkcji oraz typ przedmiotu wybranego z CheckListy.
To powyższe udało mi się osiągnąć samodzielnie i na razie wygląda następująco:

Implementacja klasy:
 

public class production_ordered
        {
            public string production_time_obj; // A <- tę zmienną zamienię później na int, więc na razie jej typ nie ma znaczenia.
            public int par_quan; // B
            public int lin_quan; //C
            public string type; //D
            public int ID_prd;
            public int tick_start;

            public void Ordered_prd(string A, int B, int C, string D, int ID, int prd_tick_start_val)
            {
                
                this.production_time_obj = A;
                this.par_quan = B;
                this.lin_quan = C;
                this.type = D;
                this.ID_prd = ID;
                this.tick_start = prd_tick_start_val;
                
            }
           
        }


Wywołanie konstruktora na kliknięcie przycisku:
 

  public void button1_Click_1(object sender, EventArgs e)
        {
//#######################################################################################
            string a = production_time;

            bool ol;
            int b;
            ol = int.TryParse(Parallel_quantity.Text, out b );

            bool rec;
            int c;
            rec = int.TryParse(Linear_quantity.Text, out c ) ;


            string d = checkedItemText;
            id++;

            int tck_start_btn = tick;

            production_ordered prod= new production_ordered();
            prod.Ordered_prd(a, b, c, d, id, tck_start_btn);
.
.
.
.
}



Jeśli chodzi o wartości liniowe(linear) i równoległe(parallel) produkcji to później będę chciał zrobić tak, że jeżeli użytkownik w aplikacji wklepał sobie parallel_quantity=1 i linear_quantity=2, to oznacza, że są zamówienia na 2 przedmioty(mają one czas produkcji x) i naraz produkowany jest tylko 1 przedmiot przedmiot nr 2 zacznie być produkowany dopiero gdy zakończy się produkcja przedmiotu 1, jeżeli zaś użytkownik wklepał by dane na odwrót oznaczałoby to, że obydwa przedmioty są produkowane NARAZ - czyli nie ma kolejki.

Próbowałem tego uniknąć ale niestety się nie da - muszę stworzyć tablicę obiektów... bo później będę musiał identyfikować i "zaznaczać" całe obiekty, które wyróżniają się własnie id lub czymś w tym rodzaju.

Wracając od tematu tablicy obiektów nie za bardzo wiem jak ją zaimplementować, bo przecież za każdym razem jak użytkownik będzie klikał przycisk będzie powstawać nowy obiekt - czyli tablica nie może być o z góry ustawionych rozmiarach.
Mam również kolejne pytanie czy tablica obiektów może być zadeklarowana za pomocą np. int tab jeżeli obiekt sam w sobie ma atrybuty o różnych typach danych?

2 odpowiedzi

+2 głosów
odpowiedź 30 grudnia 2020 przez adrian17 Ekspert (344,100 p.)
edycja 30 grudnia 2020 przez adrian17

Po pierwsze:

public class production_ordered
{
    public string production_time_obj; // A <- tę zmienną zamienię później na int, więc na razie jej typ nie ma znaczenia.
    public int par_quan; // B
    public int lin_quan; //C
 
    public void Ordered_prd(string A, int B, int C, string D, int ID, int prd_tick_start_val)
    {

Zamiast takiej metody i parametrów A, B, C można po prostu konstruktor.

public class ProductionOrder
{
    public string productionTime; // tę zmienną zamienię później na int, więc na razie jej typ nie ma znaczenia.
    public int parQuantity;
    public int linQuantity;
 
    public ProductionOrder(string productionTime, int parQuantity, int linQuantity, etc)
    {

Po drugie:

czy tablica obiektów może być zadeklarowana za pomocą np. int tab jeżeli obiekt sam w sobie ma atrybuty o różnych typach danych?

To pytanie trochę nie ma sensu :( Jeśli tablica zawiera obiekty typu np klasy ProductionOrder, no to... jest tablica typu ProductionOrder. Nie musi jej interesować co jest w jej środku, a typ jest jeden.

Co do głównego pytania.

 bo przecież za każdym razem jak użytkownik będzie klikał przycisk będzie powstawać nowy obiekt - czyli tablica nie może być o z góry ustawionych rozmiarach.

No to wtedy w ogóle nie używa się tablic, tylko klas przechowujących listę obiektów o zmiennym rozmiarze, jak `List<ProductionOrder>`.

+1 głos
odpowiedź 30 grudnia 2020 przez Snejki Stary wyjadacz (14,520 p.)

Ogólnie z tablicami jest tak jak wspominałeś, musisz określić ich wielkość przy  tworzeniu jej egzemplarza.

W C# jednak istnieją typy, które działają podobnie jak tablica, jednak przy ich tworzeniu nie musimy wskazywać jej rozmiaru. Takim typem jest np. List<T>, gdzie T jest typem jaki ma przechowywać tablica. Przykładowo dla listy przechowującej typy int tworzenie utworzenie jej wygląda następująco: 

var list = new List<int>();

Do listy w każdym momencie możesz dodać nowy element w taki sposob:

list.Add(12);

 

komentarz 31 grudnia 2020 przez j.cob_21 Początkujący (350 p.)

Dobra proszę o jeszcze jedną podpowiedź, czy dobrze rozumuję, że jeżeli tutaj napiszę tak:
 

 public Production_usercontrol()
        {
            InitializeComponent();
            Prd_timer.Start();
            var list = new List<int>();
        }

To zainicjalizuję stworzenie pustej listy i teraz jak chcę do listy dodawać kolejne obiekty to w  private void Button_Click do istniejącego już kodu(który jest powyżej) muszę dodać taką linijkę:
 

list.Add(prod);

Czy dobrze myślę?
Czy jakoś inaczej to trzeba zrobić?
I teraz mam jeszcze jedno pytanie, jeżeli dla każdego obiektu prod istnieje indywidualny atrybut ID po którym chcę ten obiekt wywowływać to jak zaznaczyć ten konkretny obiekt który ma ID np. 6 i zmienić w nim jakiś inny atrybut X z wartości Y na ?

Podobne pytania

+1 głos
1 odpowiedź 549 wizyt
pytanie zadane 20 kwietnia 2021 w C i C++ przez Dawidziu Bywalec (2,610 p.)
0 głosów
1 odpowiedź 537 wizyt
pytanie zadane 9 stycznia 2019 w C i C++ przez A$AP_Becari Nowicjusz (170 p.)
0 głosów
1 odpowiedź 724 wizyt

92,453 zapytań

141,262 odpowiedzi

319,086 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...