Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Ordinare una classifica
Forum - C# / VB.NET - Ordinare una classifica

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


Messaggi: 10
Iscritto: 05/02/2010

Segnala al moderatore
Postato alle 18:38
Venerdì, 05/02/2010
Ciao a tutti, questo è il mio primo post. Avrei bisogno di un aiuto con vb.net express 2008. Ho creato un window form per inserire i voti di una gara di karate.

ho dei valori del tipo: nome, voto, voto_max, voto_min, tutti array contenenti i valori degli atleti.

Fino a quando si tratta di ordinare la classifica per voto uso array.sort(voto, nome) ma nel caso di pari merito dovrei ordinare:

1.prima per voto
2.poi per voto_min

nel caso di ulteriore pari merito

3. per voto_max

Non sono riuscito a trovare una soluzione funzionante, anche perchè questo e il mio primo programma.....

Grazie a tutti


Alberto
PM Quote
Avatar
XBarboX (Member)
Guru


Messaggi: 945
Iscritto: 31/12/2008

Segnala al moderatore
Postato alle 21:13
Venerdì, 05/02/2010
puoi fare un piccolo esempio perchè non si capisce...


The old lie: Dulce et decorum est pro patria mori
PM Quote
Avatar
walker93 (Member)
Expert


Messaggi: 460
Iscritto: 31/01/2010

Segnala al moderatore
Postato alle 22:13
Venerdì, 05/02/2010
credo di aver capito...
tu vuoi riordinare il tuo array voto e nel caso ci sono due voti uguali (tipo 6 e 6) che posizioni per primo quello con voto_min più basso o più alto (a seconda di come ti serve)nel caso ci siano voti uguali e voti_min uguali vada a vedere voto_max e faccia uguale come con voto_min


Il software è come il sesso, è meglio quando è libero.
Linus Torvalds, Conferenza della Free Software Foundation, 1996 (attribuito)

Non provare mai a spiegare il computer a un profano. È più facile spiegare il sesso a una vergine.
Robert Anson Heinle
PM Quote
Avatar
Gianluca87 (Ex-Member)
Expert


Messaggi: 300
Iscritto: 16/11/2008

Segnala al moderatore
Postato alle 8:45
Sabato, 06/02/2010
ti suggerisco di legare tutti i valori di un alteta dentro una classe atleta tramite degli attributi... e di gestire i tuoi risultati come List<Atleta>
con linq puoi dargli tutti gli ordinamenti che vuoi


a domanda precisa, risposta precisa...
a domanda generica, risposta generica...
PM Quote
Avatar
albertino (Normal User)
Newbie


Messaggi: 10
Iscritto: 05/02/2010

Segnala al moderatore
Postato alle 13:38
Sabato, 06/02/2010
Ok, cerco di chiarire meglio, la classifica dovrebbe essere una cosa del tipo

posizione   nome   voto    voto_min     voto_max

    1.     Pippo    76        35           38
    2.     Pluto    72        30                     Pari merito
    3.     Tpolino  72        28                     Pari merito con voto_min minore

Esattamente come ha detto Walker

Ultima modifica effettuata da albertino il 06/02/2010 alle 13:39


Alberto
PM Quote
Avatar
Gianluca87 (Ex-Member)
Expert


Messaggi: 300
Iscritto: 16/11/2008

Segnala al moderatore
Postato alle 21:36
Sabato, 06/02/2010
mi spiego meglio... ad esempio...classe per l'atleta
Codice sorgente - presumibilmente C#

  1. public class Atleta
  2.     {
  3.        public int Posizione { get; set; }
  4.        public string Nome { get; set; }
  5.        public int Voto { get; set; }
  6.        public int VotoMax { get; set; }
  7.        public int VotoMin { get; set; }
  8.     }


inserisco un pò di dati...

Codice sorgente - presumibilmente C# / VB.NET

  1. List<Atleta> Atleti = new List<Atleta>();
  2.             Atleti.Add(new Atleta()
  3.             {
  4.                 Nome = "Pippo1",
  5.                 Posizione = 1,
  6.                 Voto = 10,
  7.                 VotoMax = 100,
  8.                 VotoMin = 1
  9.             });
  10.             Atleti.Add(new Atleta()
  11.             {
  12.                 Nome = "Pippo2",
  13.                 Posizione = 3,
  14.                 Voto = 30,
  15.                 VotoMax = 80,
  16.                 VotoMin = 10
  17.             });
  18.             Atleti.Add(new Atleta()
  19.             {
  20.                 Nome = "Pippo3",
  21.                 Posizione = 2,
  22.                 Voto = 50,
  23.                 VotoMax = 90,
  24.                 VotoMin = 20
  25.             });


Li ordino con una semplice query linq
Codice sorgente - presumibilmente C# / VB.NET

  1. var res =
  2.                     from a in Atleti
  3.                     orderby a.Posizione, a.Voto,a.VotoMax,a.VotoMin,a.Nome
  4.                     select a;
  5.             List<Atleta> AtletiOrdinati = (List<Atleta>)res.ToList();



a domanda precisa, risposta precisa...
a domanda generica, risposta generica...
PM Quote
Avatar
albertino (Normal User)
Newbie


Messaggi: 10
Iscritto: 05/02/2010

Segnala al moderatore
Postato alle 17:42
Domenica, 07/02/2010
Ok spero di avere capito il concetto. Il mio codice ora è

Codice sorgente - presumibilmente VB.NET

  1. Imports System.Linq
  2.  
  3. Public Class Form1
  4.  
  5.     Dim Bob = New Atleta("Bob", 35, 25, 45)
  6.     Dim Joe = New Atleta("Joe", 35, 27, 49)
  7.     Dim Luc = New Atleta("Luc", 33, 22, 42)
  8.  
  9.     Dim atleti() As Atleta = {Bob, Joe, Luc}
  10.  
  11.  
  12.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  13.  
  14.         Dim classifica = From d In atleti _
  15.         Select d _
  16.         Order By d.voto, d.VotoMax, d.VotoMin
  17.  
  18.         For Each d In classifica
  19.             MsgBox(d.nome)
  20.         Next
  21.  
  22.     End Sub
  23. End Class
  24.  
  25.  
  26. Public Class Atleta
  27.  
  28.     Public _Nome As String
  29.     Public _Voto As Integer
  30.     Public _VotoMax As Integer
  31.     Public _VotoMin As Integer
  32.  
  33.     Public Sub New(ByVal nome As String, ByVal voto As Integer, ByVal VotoMax As Integer, ByVal VotoMin As Integer)
  34.  
  35.         _Nome = nome
  36.         _Voto = voto
  37.         _VotoMax = VotoMax
  38.         _VotoMin = VotoMin
  39.  
  40.     End Sub
  41.  
  42.     Public ReadOnly Property Nome() As String
  43.  
  44.         Get
  45.             Return _Nome
  46.         End Get
  47.  
  48.     End Property
  49.  
  50.     Public ReadOnly Property voto() As Integer
  51.  
  52.         Get
  53.             Return _Voto
  54.         End Get
  55.  
  56.     End Property
  57.  
  58.     Public ReadOnly Property VotoMax() As Integer
  59.  
  60.         Get
  61.             Return _VotoMax
  62.         End Get
  63.  
  64.     End Property
  65.  
  66.     Public ReadOnly Property VotoMin() As Integer
  67.  
  68.         Get
  69.             Return _VotoMin
  70.         End Get
  71.  
  72.     End Property
  73.  
  74. End Class



Ora il problema è: I miei nomi arrivano da delle TextBox. Come faccio ad adattare

Dim Bob = New Atleta("Bob", 35, 25, 45)

e

Dim atleti() As Atleta = {Bob, Joe, Luc, Gennaro}

per inserire i valori della TextBox ?

Grazie.....

Ultima modifica effettuata da albertino il 08/02/2010 alle 14:53


Alberto
PM Quote
Avatar
Gianluca87 (Ex-Member)
Expert


Messaggi: 300
Iscritto: 16/11/2008

Segnala al moderatore
Postato alle 15:17
Domenica, 28/02/2010
Testo quotato

Postato originariamente da albertino:

Ok spero di avere capito il concetto. Il mio codice ora è

Codice sorgente - presumibilmente VB.NET

  1. Imports System.Linq
  2.  
  3. Public Class Form1
  4.  
  5.     Dim Bob = New Atleta("Bob", 35, 25, 45)
  6.     Dim Joe = New Atleta("Joe", 35, 27, 49)
  7.     Dim Luc = New Atleta("Luc", 33, 22, 42)
  8.  
  9.     Dim atleti() As Atleta = {Bob, Joe, Luc}
  10.  
  11.  
  12.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  13.  
  14.         Dim classifica = From d In atleti _
  15.         Select d _
  16.         Order By d.voto, d.VotoMax, d.VotoMin
  17.  
  18.         For Each d In classifica
  19.             MsgBox(d.nome)
  20.         Next
  21.  
  22.     End Sub
  23. End Class
  24.  
  25.  
  26. Public Class Atleta
  27.  
  28.     Public _Nome As String
  29.     Public _Voto As Integer
  30.     Public _VotoMax As Integer
  31.     Public _VotoMin As Integer
  32.  
  33.     Public Sub New(ByVal nome As String, ByVal voto As Integer, ByVal VotoMax As Integer, ByVal VotoMin As Integer)
  34.  
  35.         _Nome = nome
  36.         _Voto = voto
  37.         _VotoMax = VotoMax
  38.         _VotoMin = VotoMin
  39.  
  40.     End Sub
  41.  
  42.     Public ReadOnly Property Nome() As String
  43.  
  44.         Get
  45.             Return _Nome
  46.         End Get
  47.  
  48.     End Property
  49.  
  50.     Public ReadOnly Property voto() As Integer
  51.  
  52.         Get
  53.             Return _Voto
  54.         End Get
  55.  
  56.     End Property
  57.  
  58.     Public ReadOnly Property VotoMax() As Integer
  59.  
  60.         Get
  61.             Return _VotoMax
  62.         End Get
  63.  
  64.     End Property
  65.  
  66.     Public ReadOnly Property VotoMin() As Integer
  67.  
  68.         Get
  69.             Return _VotoMin
  70.         End Get
  71.  
  72.     End Property
  73.  
  74. End Class



Ora il problema è: I miei nomi arrivano da delle TextBox. Come faccio ad adattare

Dim Bob = New Atleta("Bob", 35, 25, 45)

e

Dim atleti() As Atleta = {Bob, Joe, Luc, Gennaro}

per inserire i valori della TextBox ?

Grazie.....


scusa se rispondo in ritardo ma ho avuto parecchio da fare :rofl:
in anzi tutto
Dim atleti() As Atleta = {Bob, Joe, Luc, Gennaro}
crea un array non una lista...
in vb dovrebbe essere
Dim Atleti As New List(Of Atleta)()
Atleti.Add(New Atleta())
Public ReadOnly  non ha molto senso...
Per inserire i valori delle textbox è sufficiente che le passi al costruttore quando istanizi un nuovo atleta (New Atleta(textbox1.text,textbox2.text ecc..... ))


a domanda precisa, risposta precisa...
a domanda generica, risposta generica...
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 19:32
Lunedì, 01/03/2010
Per prima cosa:
Codice sorgente - presumibilmente C# / VB.NET

  1. Dim classifica = From d In atleti _
  2.         Select d _
  3.         Order By d.voto, d.VotoMax, d.VotoMin


E' non del tutto corretto. La parte di query "Select q" è inutile:
Codice sorgente - presumibilmente C# / VB.NET

  1. Dim classifica = From d In atleti _
  2.    Order By d.voto, d.VotoMax, d.VotoMin


Puoi mettere Select q alla fine, per completezza, ma non è necessario.

E come dice Gianluca, le proprietà ReadOnly non hanno molto senso in questo caso (con l'unica eccezione del nome, poiché di solito uno non cambia nome...). I voti possono variare, quindi la proprietà dovrebbe avere anche i permessi di scrittura.

Per Gianluca, invece: le query LINQ possono essere eseguite su qualsiasi insieme o collezione enumerabile (ossia che implementi IEnumerable), quindi anche gli array.


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo