Si no se trata de un ejercicio (que te obligue a usar estrcturas) yo utilizaría objetos![]()
Buenas de nuevo, mi problema consiste en que no sé como ordenar un array de estructuras por un campo de la estructura, a continuación os dejo el código con el problema en rojo:
Realmente no sé si se puede hacer eso, alguien sabe cómo?Código:Const NUM As Integer = 3 Dim tabla(NUM) As Alumno Structure Alumno Public Nombre As String Public Edad As Integer Public Peso As String Public Function Mostrar() As String Dim s As String s = "Nombre: " & Nombre & "Edad: " & Edad & "Peso: " & Peso Return s End Function End Structure Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim mas As Integer Dim entre As Integer Dim menos As Integer Dim suma As Integer For index = 1 To NUM Dim a As Alumno = Nothing a.Edad = InputBox("Introduzca la edad del alumno: " & index) a.Peso = InputBox("Introduzca el peso del alumno: " & index) If a.Edad <> Nothing And a.Peso <> Nothing Then tabla(index) = a If CDbl(a.Peso) < 40 Then menos += 1 TextBox1.Text = menos ElseIf CDbl(a.Peso) > 60 Then mas += 1 TextBox3.Text = mas Else entre += 1 TextBox2.Text = entre End If Else index -= 1 End If suma += a.Edad Next TextBox6.Text = suma / NUM TextBox4.Text = tabla.Min().Edad TextBox5.Text = tabla.Max().Edad End Sub
Mi PC -> P6T Deluxe V2 | I7 950 3.06Ghz | GeForce GTX 460 OC 1GB GDDR5 | DDR3 1866 6GB 3x2GB CL9 | NOX Urano 600W | NZXT Lexa S | SB 7200.12 500Gb | Iomega 500Gb |
Correcto, lastMonkey se trata de un ejercicio que me obliga a usar estructuras (lo cual lo veo inútil porque para eso están los objetos pero bueno...)
¿alguna idea de por qué no se puede hacer lo que yo hago?
Mi PC -> P6T Deluxe V2 | I7 950 3.06Ghz | GeForce GTX 460 OC 1GB GDDR5 | DDR3 1866 6GB 3x2GB CL9 | NOX Urano 600W | NZXT Lexa S | SB 7200.12 500Gb | Iomega 500Gb |
Yo tampoco soy de los que usan estructuras, al final también termino utilizando objetos, pero por lo que he leído alguna vez de forma rápida, las estructuras tienen sentido porque requieren de menos recursos y son más eficientes en cuanto a acceso.
Supongo que buscando estructuras vs objetos se encuentra bastante, pero la idea general es esa, son más eficientes.
Siendo un ejercicio como comentas, igual tiene que ser también un array y no una lista u otro tipo de colección, ¿no? Porque en .NET se tienen algunas colecciones que ya tienen sus funciones para ordenar y no hace falta hacer nada. Pero no son arrays, por eso te comento que si tienen que ser estrictamente un array o no. Quizás lo que requiere el ejercicio es que implementes algún algoritmo de ordenación.
Saludos.
Daimroc.
Última edición por daimroc; 07/02/2012 a las 08:14
He hecho alguna prueba con arrays, que los tenía un poco olvidados ya que últimamente utilizo listas, pero he visto que sí tiene también funciones de ordenación.
Yo las pruebas las he hecho con .NET 4.0, pero debería de servir con la versión 3.5, ya que lo que se necesita es tener acceso a Linq, si no estoy equivocado. Mi ejemplo te lo pongo en C# porque VB hace tiempo que no lo uso, pero espero que te sirva de guía.
Yo la estrucutura que he utilizado ha sido la siguiente:
struct Alumno
{
public string Nombre;
public int Edad;
public string Peso;
}
Es una versión reducida de tu estructura, porque donde declaras funciones dentro de la estructura no sé bien cómo funciona.
Entonces he creado un array de dos elementos:
Alumno[] miArray = new Alumno[2];
Alumno miAlumno = new Alumno();
miAlumno.Nombre = "Pedro";
miAlumno.Edad = 20;
miAlumno.Peso = "60";
miArray[0] = miAlumno;
Alumno miAlumno2 = new Alumno();
miAlumno2.Nombre = "Juan";
miAlumno2.Edad = 30;
miAlumno2.Peso = "70";
miArray[1] = miAlumno2;
Y finalmente he ordenado el array del modo siguiente:
miArray = miArray.OrderBy(a => a.Nombre).ToArray();
Utilizando el método OrderBy y como parámetro, un criterio de ordenación.
Cosas a tener en cuenta. Para ordenar el array se tiene que asignar el resultado a un array de destino para que se ordene, en este caso he asignado el resultado al propio array, para que sea éste el que quede ordenado y así no creo una variable nueva. Es decir, si hago solo miArray.OrderBy(a => a.Nombre).ToArray() no quedará ordenado.
También es necesario indicar el destino del resultado mediante To.Array(), si no te dará un error de compilación, que ya te avisaría. Otros destinos pueden ser ToList() o ToDictionary().
Por si no conoces Linq, que es lo que he utilizado como parámetro de la función OrderBy, es lo siguiente:
a=>a.Nombre
a: el tipo de objeto que se quiere ordenar. Como está delante del => indica el parámetro de búsqueda.
=> indica que es una expresión de criterio, en este caso de búsqueda, pero podría ser expresión de comparación o lo que sea, dependiendo de la función utilizada.
a.Nombre: indica el campo por el que se quiere ordenar. Como "a" ya se sabe que es de tipo alumno, lo deduce el compilador, se tiene acceso a sus propiedades, y se puede indicar cualquiera de sus campos como criterio de búsqueda. En este caso el nombre. Se podría indicar la edad y entonces ordenaría por edad.
También existe el método OrderByDescending que se usa del mismo modo pero que lo que hace es ordenar de forma descendente.
Un saludo.
Daimroc.