Ordinamento di una Dictionary

di il
10 risposte

Ordinamento di una Dictionary

Buonasera a tutti,
ho un file di testo dove ci sono diverse migliaia di righe con dati che hanno una logica particolare.
chi ha impostato questi file inizialmente aveva un senso. ma poi nel corso degli anni, pezzotto dopo pezzotto è diventato un casino.
cmq per non divagare prendo una riga alla volta la splitto e metto in un array (per fare esperienza) il codice del prodotto e il prezzo.
Lo aggiungo in un dictionary e nel frattempo sommo ogni vendita effettuata negli ultimi 3 anni.

Lo so la scrittura è molto elementare. Però sembra gira tutto bene.

tranne per l'ordinamento.
Quando carico nella richbox i codici con i prezzi sono tutti mischiati.




namespace EsperimentiDictionary
{
    public partial class Form1 : Form
    {
        StreamReader leggi = new StreamReader("C:\\Users\\PC\\Desktop\\CONSOLLE\\ricavo_prodotti.txt");
        string[,] prodotto = new string[1,2];
        string[] subrigo;
        string rigo;
        Dictionary<string, decimal> dizionario = new Dictionary<string,decimal>();
        public Form1()
        {
            InitializeComponent();
            prodotto[0, 0] = "0";
            prodotto[0, 1] = "0";
            System.Globalization.CultureInfo.CurrentCulture = new System.Globalization.CultureInfo("en-US", false);
        }
      
        public void Codifica(string[] _subrigo, string[,] _prodotto)
        {
            switch (_subrigo[0])
            {
                case "2020":
                    _prodotto[0, 0] = _subrigo[3];
                    _prodotto[0, 1] = _subrigo[4];
                    break;
                case "2021":
                    _prodotto[0, 0] = _subrigo[5];
                    _prodotto[0, 1] = _subrigo[6];
                    break;
                case "2022":
                    _prodotto[0, 0] = _subrigo[7];
                    _prodotto[0, 1] = _subrigo[8];

                    break;
                default:
                    StreamWriter scriviLog = new StreamWriter("C:\\Users\\PC\\Desktop\\CONSOLLE\\analizzaLog.txt", true);
                    scriviLog.WriteLine(DateTime.Now + "\tError: Metodo CODIFICA\t" + this.rigo);
                    scriviLog.Close();
                    break;
            }
        }
        public void DictionaryADD(string[,] _product, Dictionary<string, decimal> dic)
        {
            decimal prezzo = decimal.Parse(_product[0, 1]);
            string codice = _product[0, 0];
            try
            {
                bool verifica = dic.ContainsKey(codice);
                if (verifica)
                {
                    dic[codice] += prezzo;
                }
                else
                {
                    dic.Add(codice, prezzo);
                    dic = dic.OrderBy(x => x.Key).ToDictionary(x => x.Key, x => x.Value);
                }
            }
            catch (Exception ex)
            {
                StreamWriter scriviLog = new StreamWriter("C:\\Users\\PC\\Desktop\\CONSOLLE\\analizzaLog.txt", true);
                scriviLog.WriteLine(DateTime.Now + "\tError: Metodo DictionaryADD\t" + ex.Message);
                scriviLog.Close();
            }
        }

        private void LeggiDictionary(Dictionary<string, decimal> dic, RichTextBox rtb)
        {
            string riga;
            foreach (KeyValuePair<string, decimal> kv in dic)
            {
                riga = (kv.Key.ToString() + "\t" + kv.Value.ToString() + "\r\n");
                rtb.AppendText(rigo);
            }
        }

        private void btnVisualizza_Click(object sender, EventArgs e)
        {
            while (!leggi.EndOfStream)
            {
                rigo = leggi.ReadLine();
                subrigo = rigo.Split(';');
                Codifica(subrigo, prodotto);
                DictionaryADD(prodotto, dizionario);
            }
            richTextBoxTotProdotto.Clear();
            LeggiDictionary(dizionario, richTextBoxTotProdotto);

        }

10 Risposte

  • Re: Ordinamento di una Dictionary

    Una cosa è un ordinamento di valori numerici, un'altra cosa un ordinamento di stringhe. Se i valori sono contenuti in stringhe l'ordinamento è alfabetico e quindi non va bene.

    Quello che non comprendo è perché non inserisci i dati in un DB al posto di usare il file.
  • Re: Ordinamento di una Dictionary

    Pivello ha scritto:


    ho un file di testo dove ci sono diverse migliaia di righe con dati che hanno una logica particolare.
    Lo conosciamo... è sempre quello stesso file di testo di cui vai parlando da settimane, quello creato dal famigerato collega tanti anni fa, che ha una "logica particolare" di cui però - in ben tre discussioni che hai aperto sempre per lo stesso motivo - ancora non c'è stato verso di sapere né come è fatto, né come è strutturato, né c'è stata la possibilità di vederne un pezzettino, nonostante questo sia stato richiesto innumerevoli volte.

    Pivello ha scritto:


    chi ha impostato questi file inizialmente aveva un senso.
    No, è del tutto probabile che un senso non ce l'abbia mai avuto.

    Pivello ha scritto:


    cmq per non divagare prendo una riga alla volta la splitto e metto in un array (per fare esperienza) il codice del prodotto e il prezzo.
    Non so che tipo di esperienza possa derivare da questa operazione: è come lavorare in una cucina e, per esperienza, mettersi a fissare i cucchiai da minestra riflettendocisi dentro prima di riporli. Si tratta di una operazione elementare: l'array è una delle strutture più basiche con cui si può avere a che fare, e lo "split" delle informazioni di fatto viene eseguito dal framework chiamando l'apposito metodo, quindi più che "per esperienza" si tratta di una banale logica di parsing di un file di testo che probabilmente è assimilabile a un CSV. Dico "probabilmente" perché, di nuovo, non lo abbiamo mai visto, e non starò qui a chiederlo di nuovo.

    Pivello ha scritto:


    Lo aggiungo in un dictionary e nel frattempo sommo ogni vendita effettuata negli ultimi 3 anni.
    Lo so la scrittura è molto elementare. Però sembra gira tutto bene.
    Ne dubito. Ci sono pezzi di codice che non hanno un senso evidente, oppure contengono errori formali e anche sostanziali.
    Segue qualche esempio.
    
    StreamReader leggi = new StreamReader("C:\\Users\\PC\\Desktop\\CONSOLLE\\ricavo_prodotti.txt");
    
    Perché lo StreamReader viene istanziato in questa posizione e assegnato a un campo del Form? Rimarrà attivo fino a quando il Form sarà in memoria, tenendo bloccato il file e occupando risorse inutilmente. Il file va aperto nel momento in cui serve, e va chiuso una volta che i dati sono stati caricati. Leggi la documentazione su StreamReader.
    
            string[,] prodotto = new string[1,2];
            string[] subrigo;
            string rigo;
            Dictionary<string, decimal> dizionario = new Dictionary<string,decimal>();
    
    Idem come sopra: sono tutte variabili che possono essere locali, forse tranne dizionario visto che è usato da più metodi.
    
            public Form1()
            {
                InitializeComponent();
                prodotto[0, 0] = "0";
                prodotto[0, 1] = "0";
                System.Globalization.CultureInfo.CurrentCulture = new System.Globalization.CultureInfo("en-US", false);
            }
    
    Questo uso di prodotto e la sua inizializzazione globale (che mi pare non venga nemmeno modificata) non ha senso: i dati dei prodotti vengono caricati quindi non serve tenere in memoria questa informazione, né si capisce a cosa serve (anche per via del fatto che si chiama "prodotto" e quindi non dice nulla).
    
                    else
                    {
                        dic.Add(codice, prezzo);
                        dic = dic.OrderBy(x => x.Key).ToDictionary(x => x.Key, x => x.Value);
                    }
                }
    
    A che serve ordinare continuamente il dizionario ogni volta? Il dizionario è "naturalmente" ordinato per chiave, quindi non va riordinato a mano, tra l'altro creando in seguito un altro dizionario che è già appunto ordinato per chiave, per definizione.

    Mi fermo qui, ma ci sono tantissimi altri errori che rendono illeggibile il codice, poco comprensibile, ed è evidente che stai usando elementi (classi, metodi, ecc.) un po' a casaccio, senza vedere esempi corretti di utilizzo o leggere la relativa documentazione per capire qual è l'uso corretto degli strumenti che usi.
  • Re: Ordinamento di una Dictionary

    oregon ha scritto:


    Quello che non comprendo è perché non inserisci i dati in un DB al posto di usare il file.
    perchè ancora non ho imparato a usarli.
    non so se devo usare un dataset interno o delle tabelle esterne.
    bho. a google faccio domande. E a voi chiedo esperienza. Lo so è brutto da dire.
    ha ragione Alka. sto usando il forum in modo sbagliato. scusate.
  • Re: Ordinamento di una Dictionary

    Alka GRAZIE PER LA RISPOSTA DETTAGLIATA.
    negli anni questo è quello che avete fatto per me.
    ed è quello che cercavo.
    non avete corretto gli errori grammaticali. ma quelli "logici".
    ora prenderò la tua risposta e cercherò di capire come fare nel modo corretto le cose.

    forse è arrivato il momento di studiare i database. anche se dovrò approfondire meglio quello fatto fin ora.
    Qualche input di "percorso" per i DB? cosi per un bel pò non vi disturbero più.
  • Re: Ordinamento di una Dictionary

    È arrivato il momento di studiare senza improvvisare.

    Non sprecare tempo nel trattare un file di testo fatto male e strutture in memoria. Studia i DB e il loro uso.
  • Re: Ordinamento di una Dictionary

    oregon ha scritto:


    È arrivato il momento di studiare senza improvvisare.
    Concordo.

    oregon ha scritto:


    Non sprecare tempo nel trattare un file di testo fatto male e strutture in memoria. Studia i DB e il loro uso.
    Il file di testo non credo sia "fatto male": probabilmente si tratta di un CSV con una esportazione di dati.

    Non è l'equivalente di un database relazionale, certo, ma (ammesso che il formato sia realmente quello) è sufficiente a dare una struttura un minimo "rigida" ai dati che contiene, consentendo di caricarli in memoria e farci delle operazioni sopra.

    Il problema si trova nella logica costruita attorno ai dati acquisiti: variabili globali dal nome e dal significato dubbio, ordinamenti ripetuti e non necessari, mancata chiusura del file di origine dei dati, stampa sottoforma di testo in modo poco congeniale, campi usati al posto di variabili locali, standard di codifica non seguiti (tipo l'uso errato degli underscore) e metodi inutilmente complicati e non necessari, passaggi per valore o per riferimento tentati a caso, e mi fermo qui.

    Di certo usare dei database può essere d'aiuto quando (del resto) si manipolano dei dati, ma in questo frangente specifico emerge che quel file e la sua struttura è realmente l'ultimo dei problemi, secondo me.
  • Re: Ordinamento di una Dictionary

    Se potessi tornare indietro. GRAZIE A TUTTI e grazie a te Alka per i consigli ma sopratutto per il tempo speso per scriverli.
  • Re: Ordinamento di una Dictionary

    Pivello ha scritto:


    Se potessi tornare indietro. GRAZIE A TUTTI e grazie a te Alka per i consigli ma sopratutto per il tempo speso per scriverli.
    Se come ti è stato richiesto, postassi ricavo_prodotti.txt sarebbe meglio, puoi ridurlo e/o mettere asterischi sui dati sensibili.
    Poi se ci dicessi cosa ti aspetti di ottenere dopo l'elaborazione, forse il codice che hai scritto prenderebbe senso.
    A mio avviso quello che cerchi di ottenere si fa con 5/10 righe di programma, ma potrei sbagliare.
  • Re: Ordinamento di una Dictionary

    Rubik ha scritto:


    Se come ti è stato richiesto, postassi ricavo_prodotti.txt sarebbe meglio, puoi ridurlo e/o mettere asterischi sui dati sensibili.
    Poi se ci dicessi cosa ti aspetti di ottenere dopo l'elaborazione, forse il codice che hai scritto prenderebbe senso.
    A mio avviso quello che cerchi di ottenere si fa con 5/10 righe di programma, ma potrei sbagliare.
    Concordo pienamente. E forse, sfruttando LINQ, ci si potrebbe avvicinare di più alle 5 righe che alle 10...
  • Re: Ordinamento di una Dictionary

    Ciao

    Probabilmente arrivo in ritardo, però mi associo a chi diceva che l'uso del DB è l'ultimo dei problemi, prima c'è proprio da rivedere la stesura del codice.

    Ad ogni modo, proprio in questi giorni ho visto che c'è un articolo qui sui iProgrammatori che parla di come caricare i dati da un file di testo usando una libreria apposita.

    Fai un salto nella sezione articoli e prova a dargli una letta, magari trovi qualcosa che ti può essere d'aiuto.
    Per esempio, se scrivi una classe con le apposite data annotation, puoi dire tranquillamente alla libreria di leggersi il file di testo e caricarti una lista di oggetti. Non è un dictionary, però per il tuo scopo credo vada benissimo lo stesso
Devi accedere o registrarti per scrivere nel forum
10 risposte