Tablica dwuwymiarowa z dynamiczną ilością elementów

0

Mam taki problem otóż. Zadaniem programu będzie możliwość ręcznego wpisywania numerów przesyłek dla trzech przewoźników by na koniec wydrukować raport.
Nie wiem jaki będzie najbardziej wydajny do tego sposób przechowywania danych w pamięci. Pierwsze co mi przyszło do głowy to stworzenie dwuwymiarowej tablicy o strukturze:

array = { 
                 "DHL" => {"324324", "2342424", "55646", itd}
                 "DPD" => {"6767567", "242444", "566566", itd}
                 "UPS" => {"234235", "546456", "534535", itd}
}

Gdzie ilość wartości w nawiasach klamrowych była by różna i można było je dodawać w trakcie działania programu
Numery przesyłek będą typu string a ich łączną ilość maksymalnie 2000 może 2500

W PHP stworzył bym taka pustą tablice a potem dodawał numery przy pomocy array_push.

poza tym każde dodanie numeru do konkretnego przewoźnika ma na bieżąco zliczać ilość już dodanych numerów w jego obrębie
Nie wiem jak to wykonać w C# i czy w ogóle warto iść typ tropem czy może istnieje bardziej wydajne rozwiązanie

0

Aha przepraszam, że pisze dodatkowy post ale zapomniałem dodać, że program ma też za każdym razem sprawdzać czy czasem nie wpisano już takiego numeru dlatego do głowy przyszły mi tablice zamiast dodawanie wszystkiego do stringu oddzielając np. przecinkiem

0

A może lepiej wykorzystać Dictionary, Hashset, List?

0

Wiesz, że możesz to sam zrobić, zamiast szukać mechanizmów(czym to zrobię?), które będą to robiły za ciebie i tak naprawdę to pierwsze jest łatwiejsze, bo wystarczy pobrać string który chcesz wstawić i jak nie istnieje, to dodać, albo po kolej porównywać wszystkie stringi, aż nie trafisz na żadnego z taką nazwą.
A jak trafisz, to albo anulować, albo zmienić istniejący, lub poinformować użytkownika.

0

Trochę nie rozumiem. Czemu chcesz fanatycznie piłować wydajność? Fanatyczne piłowanie wydajności to nienajłatwiejsze zadanie i być może C++ albo i czysty C byłby lepszy do tego. W C# trzeba by np. wyłączyć automatyczne sprawdzanie zakresów. Czy nie szkoda czasu i atłasu?

0

Nie chce na sile piłować wydajności.. Chciałbym jedynie aby podczas dodawania dwutysięcznego kodu przewozowego program nie myślał długo zanim zwróci komunikat, że taki kod już istnieje lub policzy ich ilość. Działanie na stringach a konkretnie "explodowanie" stringu po przecinku plus porównywanie każdego kodu wydaje mi się, że będzie działać znacznie wolniej niż "array.length" czy "indexOf" Chociaż mogę się mylić z C# dopiero zaczynam swoja przygodę i mam sporo w tym przypadku złych nawyków przez php i js

0

To uzyj hashet - jak @jacek.placek radzil - btw 2000 elementow to bardzo malo i watpie abys zauwazyl iz program zwalnia (przy pracy na stringu)

0

Dziękuje za odpowiedzi.

A co myślicie w tym przypadku o Array.Resize?

1

Ja myślę, że powinieneś poczytać o Dictionary i Hashset, i innych kolekcjach.
Próbujesz rozwiązać problem, który nie istnieje jeśli użyjesz odpowiednich narzędzi.

0

zdecydowałem sie na List

Powiedzcie mi proszę jeszcze na koniec taka rzecz. Otóż dla każdego przewoźnika mam osobna listę zdeklarowaną w głównej klasie publicznej

List<string> parcel1 = new List<string>();
List<string> parcel2 = new List<string>();
List<string> parcel3 = new List<string>();

Teraz dodając kod musze napisać 3 funkcje alba jedna z trzema warunkami aby odróżnić przewoźników. Jak przemycić listę do funkcji?
Próbowałem tak :

private void parcel1_Click(object sender, EventArgs e)
        {
            updateValue(parcel1);
        }
        private void parcel2_Click(object sender, EventArgs e)
        {
            updateValue(parcel2);
        }
        private void parcel3_Click(object sender, EventArgs e)
        {
            updateValue(parcel3);
        }

private void updateValue( List<string>parcelnum){
    parcelnum.Add(code);
}

ale nie dodaje elementów do osobnych list... jak to rozwiązać?

0

Co to jest "główna klasa publiczna", i skąd się bierze wartość code w updateValue.

P.S. Przestań pisać w C# kodu javowego, trzymaj się poprawnie konwencji języka.

0
somekind napisał(a):

Co to jest "główna klasa publiczna", i skąd się bierze wartość code w updateValue.

P.S. Przestań pisać w C# kodu javowego, trzymaj się poprawnie konwencji języka.

public partial class Form1 : Form

Tutaj znajdują się deklaracje trzech list natomiast code przesyłane jest przez updateValue tylko pominąłem to w poprzednim poście.
P.S Kombinuje z dictionary

0

Udało się !

zastosowałem dictionary dla list i teraz bez przesyłania listy do funkcji wszystko działa.

 Dictionary<int, List<string>> parcels = new Dictionary<int, List<string>>
            {
                {0, parcel1},
                {1, parcel2},
                {2, parcel3}
            };

Dzięki chłopaki !

0

Zamiast list zastosuj hashset - bedziesz mial latwiejszy/ladniejszy kod...

1 użytkowników online, w tym zalogowanych: 0, gości: 1