Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [VB.NET] Array da file e Combobox da Array
Forum - C# / VB.NET - [VB.NET] Array da file e Combobox da Array - Pagina 2

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
WCodeLyokoYT (Normal User)
Newbie


Messaggi: 16
Iscritto: 27/09/2014

Segnala al moderatore
Postato alle 20:57
Domenica, 25/09/2016
No, infatti non ho bisogno di una lista di streamreader, Linee è una classe del progetto. Comunque mi hai fatto notare che c'era un problema
Codice sorgente - presumibilmente Plain Text

  1. nom = Linee.ReadLine()


Leggeva la classe (infatti "linee" era azzurro). Adesso l'ho cambiato, ma il problema persiste. Domani vedo di commentare il codice come mi hai consigliato.

PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2305
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 9:01
Lunedì, 26/09/2016
Non conosco bene il Vb.NET
e non conosco nemmeno le sue potenzialità

Ma personalmente, eviterei tutto questo fracasso utilizzando una sola linea di codice.
Il Linq fà al tuo caso.

Con una sola riga, puoi recuperare o tutte le parole o tutti i numeri.

ti mostro un piccolo esempio pratico.

Codice sorgente - presumibilmente C#

  1. //Questa struttura è rappresentata dal file
  2.  //Che nel tuo esempio da un lato può contenere numeri
  3.  //Da un'altro lato può contenere parole
  4.  struct prova
  5.         {
  6.             public string parole;
  7.             public int numeri;
  8.         }
  9.  
  10.  
  11. List<prova> file = new List<prova>();




Faccio un inserimento manuale dei dati giusto per rendere l'idea

Codice sorgente - presumibilmente C# / VB.NET

  1. prova p = new prova();
  2.  
  3.             p.numeri = 1;
  4.             file.Add(p);
  5.  
  6.             p.parole="parola 1";
  7.             file.Add(p);
  8.  
  9.             p.parole = "parola 2";
  10.             file.Add(p);
  11.  
  12.             p.parole = "parola 3";
  13.             file.Add(p);
  14.  
  15.             p.numeri = 2;
  16.             file.Add(p);
  17.  
  18.             p.parole = "parola 4";
  19.             file.Add(p);
  20.  
  21.             p.parole = "parola 5";
  22.             file.Add(p);



Ho aggiunto dei dati proprio come nel tuo esempio.

Ora basta semplicemente usare il Linq per recuperare tutte le parole esempio


Codice sorgente - presumibilmente Delphi

  1. var parole = from temp in file select temp.parole;
  2. var numeri = from temp in file select temp.numeri;
  3.  
  4. //Ottengo tutti i valori sotto forma di liste rispettive ad Int per i numeri, String per le parole
  5.  
  6. List<string> parole2 = parole.ToList();
  7. List<int> numeri2 = numeri.ToList();




Ecco cosa esce dal mio Debugger

Risultato delle parole selezionate
http://s22.postimg.org/3jqdtg2td/screen.jpg


Risultato dei numeri selezionati
http://s11.postimg.org/copgkwfab/screen.jpg


Noterai nella seconda screen, che i numeri sono stati ripetuti
perché gli elementi della lista erano superiori a quelli trovati per i numeri.

Basta un semplice accorgimento

Codice sorgente - presumibilmente Plain Text

  1. //Elimino tutti i doppioni
  2.  
  3. numeri2 = numeri2.Distinct().ToList();



Gioco fatto.

Puoi tradurti il codice a Vb.net

Mi spiace, ma non sono pratico con il vb quanto lo sono con il C#
Spero che questa soluzione faccia al tuo caso.

Saluti


https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
darioza (Normal User)
Pro


Messaggi: 104
Iscritto: 06/10/2014

Segnala al moderatore
Postato alle 11:04
Lunedì, 26/09/2016
Testo quotato

Postato originariamente da WCodeLyokoYT:

No, infatti non ho bisogno di una lista di streamreader, Linee è una classe del progetto. Comunque mi hai fatto notare che c'era un problema
Codice sorgente - presumibilmente Plain Text

  1. nom = Linee.ReadLine()


Leggeva la classe (infatti "linee" era azzurro). Adesso l'ho cambiato, ma il problema persiste. Domani vedo di commentare il codice come mi hai consigliato.



Infatti qualcosa non mi tornava...ad un certo punto avevo l'impressione lo trattassi come lo stream di lettura.
prova a vedere se con quello che ha proposto thejuster riesci meglio...
in ogni caso qui non mi è chiaro
Codice sorgente - presumibilmente VB.NET

  1. Dim Linee As New StreamReader("C:\Users\Code\Desktop\Linee.txt")
  2. \\qui linee è dichiarato come streamreader del file
  3.  
  4.     Dim variabile As Integer
  5.    Private Fermate As List(Of Linee)
  6. \\qui fermate è list di linee che è uno stream...


where is your class?
Non la vedo....
se sei agli inizi e ancora devi prendere dimestichezza con vb, anche se è una soluzione grossolana e non ottimizzata, l'idea di un array multidimensionale non è male, se hai limiti di tempo.
Altrimenti, come ti dicevo, riguardati la logica ...

PM Quote
Avatar
Ultimo (Member)
Guru


Messaggi: 877
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 23:26
Lunedì, 26/09/2016
Testo quotato

Postato originariamente da Thejuster:

Non conosco bene il Vb.NET
e non conosco nemmeno le sue potenzialità

Ma personalmente, eviterei tutto questo fracasso utilizzando una sola linea di codice.
Il Linq fà al tuo caso.

Con una sola riga, puoi recuperare o tutte le parole o tutti i numeri.

ti mostro un piccolo esempio pratico.

Codice sorgente - presumibilmente C#

  1. //Questa struttura è rappresentata dal file
  2.  //Che nel tuo esempio da un lato può contenere numeri
  3.  //Da un'altro lato può contenere parole
  4.  struct prova
  5.         {
  6.             public string parole;
  7.             public int numeri;
  8.         }
  9.  
  10.  
  11. List<prova> file = new List<prova>();




Faccio un inserimento manuale dei dati giusto per rendere l'idea

Codice sorgente - presumibilmente C# / VB.NET

  1. prova p = new prova();
  2.  
  3.             p.numeri = 1;
  4.             file.Add(p);
  5.  
  6.             p.parole="parola 1";
  7.             file.Add(p);
  8.  
  9.             p.parole = "parola 2";
  10.             file.Add(p);
  11.  
  12.             p.parole = "parola 3";
  13.             file.Add(p);
  14.  
  15.             p.numeri = 2;
  16.             file.Add(p);
  17.  
  18.             p.parole = "parola 4";
  19.             file.Add(p);
  20.  
  21.             p.parole = "parola 5";
  22.             file.Add(p);



Ho aggiunto dei dati proprio come nel tuo esempio.

Ora basta semplicemente usare il Linq per recuperare tutte le parole esempio


Codice sorgente - presumibilmente Delphi

  1. var parole = from temp in file select temp.parole;
  2. var numeri = from temp in file select temp.numeri;
  3.  
  4. //Ottengo tutti i valori sotto forma di liste rispettive ad Int per i numeri, String per le parole
  5.  
  6. List<string> parole2 = parole.ToList();
  7. List<int> numeri2 = numeri.ToList();




Ecco cosa esce dal mio Debugger

Risultato delle parole selezionate
http://s22.postimg.org/3jqdtg2td/screen.jpg


Risultato dei numeri selezionati
http://s11.postimg.org/copgkwfab/screen.jpg


Noterai nella seconda screen, che i numeri sono stati ripetuti
perché gli elementi della lista erano superiori a quelli trovati per i numeri.

Basta un semplice accorgimento

Codice sorgente - presumibilmente Plain Text

  1. //Elimino tutti i doppioni
  2.  
  3. numeri2 = numeri2.Distinct().ToList();



Gioco fatto.

Puoi tradurti il codice a Vb.net

Mi spiace, ma non sono pratico con il vb quanto lo sono con il C#
Spero che questa soluzione faccia al tuo caso.

Saluti



Thejuster potrebbe andar meglio un Dizionario[Integer,List(string)] al posto delle 2 Liste, cosa ne pensi?


If ok Then GOTO Avanza else GOTO Inizia

PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2305
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 9:23
Mercoledì, 28/09/2016
Uhm , no il dizionario non credo che vada bene.

Perché ha specificato chiaramente che nel suo file sono presenti valori interi e stringhe
mischiati non ordinati.

Il dizionario ha bisogno di una chiave e di un valore
poi sarebbe più chiassoso riordinarli in modo corretto.

Il mio era semplicemente un aiuto e poco più.
Io avrei fatto una cosa completamente diversa e molto più performante.

Avrei diviso le stringe tramite una semplice funzione.

Il metodo corretto e veloce per ottenere ciò e questo:


FILE.txt

1
prova1
prova2
prova3
2
3
prova4
prova5
prova6


faccio un'altro esempio molto veloce

Codice sorgente - presumibilmente C# / VB.NET

  1. object[] elementi = new object[] { 1, "prova1", "prova2", "prova3", 2, "prova4", "prova5", 3 };
  2.  
  3.  
  4.             string[] stringe = GetArray<string>(elementi);
  5.             int[] numeri = GetArray<int>(elementi);
  6.  
  7.             string[] valori_numerici = numeri.Select(x => x.ToString()).ToArray();
  8.  
  9.  
  10.             comboBox1.Items.AddRange(stringe);
  11.             comboBox2.Items.AddRange(valori_numerici);
  12.  
  13.  
  14.  
  15.   //Restituisce un array specificando il tipo di output da dare
  16.   public T[] GetArray<T>(object[] array)
  17.         {
  18.             List<T> list = new List<T>();
  19.  
  20.             foreach (object o in array)
  21.             {
  22.                 if (o is T)
  23.                 {
  24.                     list.Add((T)o);
  25.                 }
  26.             }
  27.  
  28.             return list.ToArray();
  29.         }




Automaticamente, la funzione andrà a prendere solo i valori di tipo stringa o di tipo int
successivamente converto l'array intero in un array di tipo string.
e faccio AddRange evitando di creare un ciclo per l'inserimento manuale degli elementi.

Ultima modifica effettuata da Thejuster il 28/09/2016 alle 9:30


https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
Ultimo (Member)
Guru


Messaggi: 877
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 11:37
Mercoledì, 28/09/2016
Testo quotato

Postato originariamente da Thejuster:
Codice sorgente - presumibilmente C# / VB.NET

  1. object[] elementi = new object[] { 1, "prova1", "prova2", "prova3", 2, "prova4", "prova5", 3 };
  2.  
  3.  
  4.             string[] stringe = GetArray<string>(elementi);
  5.             int[] numeri = GetArray<int>(elementi);
  6.  
  7.             string[] valori_numerici = numeri.Select(x => x.ToString()).ToArray();
  8.  
  9.  
  10.             comboBox1.Items.AddRange(stringe);
  11.             comboBox2.Items.AddRange(valori_numerici);
  12.  
  13.  
  14.  
  15.   //Restituisce un array specificando il tipo di output da dare
  16.   public T[] GetArray<T>(object[] array)
  17.         {
  18.             List<T> list = new List<T>();
  19.  
  20.             foreach (object o in array)
  21.             {
  22.                 if (o is T)
  23.                 {
  24.                     list.Add((T)o);
  25.                 }
  26.             }
  27.  
  28.             return list.ToArray();
  29.         }




Automaticamente, la funzione andrà a prendere solo i valori di tipo stringa o di tipo int
successivamente converto l'array intero in un array di tipo string.
e faccio AddRange evitando di creare un ciclo per l'inserimento manuale degli elementi.



Ok ottimo


If ok Then GOTO Avanza else GOTO Inizia

PM Quote
Avatar
WCodeLyokoYT (Normal User)
Newbie


Messaggi: 16
Iscritto: 27/09/2014

Segnala al moderatore
Postato alle 16:56
Sabato, 29/10/2016
Grazie per le risposte, ma ancora non ho risolto.

Comunque non importa, grazie di nuovo

Ultima modifica effettuata da WCodeLyokoYT il 29/10/2016 alle 17:07
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo