2011-08-13 42 views
6

estoy tratando de tomar la entrada de usuario utilizando variedad de estructuras y luego imprimirlo:matriz de estructuras en C#

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace CA4 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     StudentDetails[,] student = new StudentDetails[5, 1]; 

     Console.WriteLine("Please enter the unit code:"); 
     student[0, 0].unitCode = Console.ReadLine(); 

     Console.WriteLine("Please enter the unit number:"); 
     student[1, 0].unitNumber = Console.ReadLine(); 

     Console.WriteLine("Please enter first name:"); 
     student[2, 0].firstName = Console.ReadLine(); 

     Console.WriteLine("Please enter last name:"); 
     student[3, 0].lastName = Console.ReadLine(); 

     Console.WriteLine("Please enter student mark:"); 
     student[4, 0].studentMark = int.Parse(Console.ReadLine()); 

     for (int row = 0; row < 5; row++) 
     { 
      Console.WriteLine(); 
      for (int column = 0; column < 1; column++) 
       Console.WriteLine("{0} ", student[row, column]); 
     } 

     Console.ReadLine(); 
    } 

    public struct StudentDetails 
    { 
     public string unitCode; //eg CSC10208 
     public string unitNumber; //unique identifier 
     public string firstName; //first name 
     public string lastName;// last or family name 
     public int studentMark; //student mark 
    } 

} 
} 

Desafortunadamente después de introducir todos los datos que obtenemos:

CA4.Program+StudentDetails 

CA4.Program+StudentDetails 

CA4.Program+StudentDetails 

CA4.Program+StudentDetails 

CA4.Program+StudentDetails 

Se no falla, solo en lugar de los datos que ingresé obtienen las 5 líneas anteriores.

Sé que la razón por la que no funciona es que no utilizo las estructuras correctamente porque sin ellas no hay ningún problema.

¿Alguien puede ayudarme y decirme cómo usar las estructuras en el ejemplo anterior? Gracias

Cheers,

n1te

Respuesta

3

Su llamada al Console.WriteLine("{0} ", student[row, column]); llama implícitamente al método ToString() de la estructura StudentDetails, que simplemente escribe el nombre del tipo de estructura de forma predeterminada. Reemplazar el método ToString():

public struct StudentDetails 
{ 
    public string unitCode; //eg CSC10208 
    public string unitNumber; //unique identifier 
    public string firstName; //first name 
    public string lastName;// last or family name 
    public int studentMark; //student mark 

    public override string ToString() 
    { 
     return string.Format("{0},{1},{2},{3},{4}", unitCode, 
       unitNumber,firstName,lastName,studentMark); 
    } 
} 

Sin embargo, el problema más grande es que está configurando las propiedades de 5 StudentDetails estructuras diferentes ... al declarar una matriz StudentDetails[,] student = new StudentDetails[5, 1]; y pidiendo al usuario datos de entrada sobre las estructuras en diferentes puntos en la matriz, es decir, student[0, 0] y luego , no está haciendo un objeto StudentDetails y propiedades de configuración en él, creó 5 diferentes objetos StudentDetails.

¿Por qué está utilizando una matriz?Si desea que el usuario rellene un solo StudentDetails objetar, acaba de hacer

StudentDetails student = new StudentDetails(); 

Console.WriteLine("Please enter the unit code:"); 
student.unitCode = Console.ReadLine(); 

Console.WriteLine("Please enter the unit number:"); 
student.unitNumber = Console.ReadLine(); 

... 

Entonces escribirlo:

Console.WriteLine("{0}", student); 

Esto utilizará el método ToString() que declaró en su StudentDetails struct . (Se llama a ToString() cuando un objeto necesita convertirse a una cadena, simplemente no siempre tiene que escribirlo)

Espero que esto ayude.

+0

En primer lugar, gracias a todos por las respuestas rápidas Para ser sincero, no tengo que usar una matriz aquí, pero la siguiente tarea es similar y estoy obligado a utilizar matrices allí, así que quería practicar. En la siguiente tarea que tengo que aceptar los datos como: número de semana, casa nombre del equipo, lejos nombre del equipo, victoria (1 o 0) programa _italic_Your debe utilizar una matriz/s de las estructuras para almacenar el datos en la memoria, es decirsu programa debe leer los datos de los archivos en la memoria como una matriz de estructuras y manipular los datos en la matriz. y habrá 5 semanas en total y 80 partidos (hay 16 equipos) – n1te

+0

Es por eso que pensé que lo probaría aquí, así que es más fácil en la próxima tarea. @Nick Bradley – n1te

+1

Eso está bien, siempre y cuando comprenda que, en el código original que publicó, no está completando una estructura de StudentDetails; está completando cinco diferentes, pero solo está completando el código de unidad en el primero (At [0,0]) unitNumber en el 2nd one ([1,0]) firstName en el 3rd .. etc. No está completando por completo ninguna de las estructuras de StudentDetails que hace. –

1

Es necesario imprimir los miembros de la estructura adecuada. Yo sugeriría un método que realiza la impresión para usted dado una estructura como

public void PrintStruct(StudentDetails stDetails) 
{ 
    Console.WriteLine(stDetails.firstName); 
    Console.WriteLine(stDetails.lastName); 
    .... etc 
} 

Alternativamente crear una clase (Esto es C#) y reemplazar el método ToString() para devolver una cadena con toda la información de miembro y usted no será necesario que modifiques tu código principal.

Las estructuras están bien para usarlas en C#, pero en los casos en los que necesita una representación de datos en lugar de una simple transferencia de datos, debe usar una clase.

+0

* "pero en los casos en los que necesita una representación de datos en lugar de una simple transferencia de datos, debe usar una clase." * ... no siempre es cierto. ;) – IAbstract

+0

En la mayoría de los casos: p –

5

Esto es porque por defecto ToString() devuelve un nombre de Tipo, has anular usted mismo de forma StudentDetails estructura:

public struct StudentDetails 
{  
    public override void ToString() 
    { 
    return String.Format(
       CultureInfo.CurrentCulture, 
       "FirstName: {0}; LastName: {1} ... ", 
       this.FirstName, 
       this.LastName); 
    } 
} 

Por cierto, ¿por qué está utilizando stuct y heredados matrices? Considere usar class en su lugar struct, y IList<StudentDetails> o IDictionary<int, StudentDetails> genérico en lugar de una matriz. Porque las matrices heredadas junto con struct (básicamente tipo de valor) introducen un boxeo (struct -> object) cada vez que agregas item a array y unboxing (object -> struct) cuando lo lees de nuevo.

+3

Minor nitpick: el generador de cadenas es un montón de trabajo sin ganancia. Solo use concatenación o un solo 'string.Format()'. – siride

+0

@siride: buen punto, gracias – sll

2

Otros han cubierto la anulación de ToString(), por lo que no volveré a generar esa información. Más aún, a su solicitud:

¿Alguien puede ayudarme y decirme cómo utilizar las estructuras en el ejemplo anterior?

Ver MSDN: Structure Design

primer lugar, su estructura es mutable. Las estructuras inmutables no son siempre la mejor solución , pero deben considerarse ... vea una publicación que tengo en el uso de Microsoft de structs inside the Dictionary class. Dicho esto, determinaría el requisito básico: ¿La estructura requiere mutabilidad? En otras palabras, ¿cambiará el nombre, el número de unidad o la marca del alumno después de la instanciación de estructuras?

En segundo lugar, si el requisito es tener una colección de StudentDetails, una matriz es fina:

// declare students collection 
StudentDetail[] students = new StudentDetail[5]; 
// declare an array indexer 
int indexer = 0; 

static void Main(string[] args) 
{ 
    Console.WriteLine("Please enter the unit code:"); 
    string unitCode = Console.ReadLine(); 

    Console.WriteLine("Please enter the unit number:"); 
    string unitNumber = Console.ReadLine(); 

    /* get the rest of your inputs */ 

    AddStudentDetails(unitCode, unitNumber, firstName, lastName, studentMark); 
} 

// demonstrate auto-magically instantiated, mutable struct 
void AddStudentDetails(string unitCode, string unitNumber, string firstName, string lastName, int studentMark) 
{ 
    students[indexer].unitCode = unitCode; 
    students[indexer].unitNumber = unitNumber; 
    students[indexer].firstName = firstName; 
    students[indexer].lastName = lastName; 
    students[indexer].studentMark = studentMark; 

    // increment your indexer 
    indexer++; 
} 

Nota: el manejo de excepciones no se considera en este ejemplo; por ejemplo, incrementando más allá de los límites de la matriz.

En el ejemplo anterior, puede cambiar cualquiera de las propiedades de la estructura StudentDetails después de la creación de instancias. Las estructuras están hechas más segura cuando inmutable:

public struct StudentDetails 
{ 
    public readonly string unitCode; //eg CSC10208 
    public readonly string unitNumber; //unique identifier 
    public readonly string firstName; //first name 
    public readonly string lastName;// last or family name 
    public readonly int studentMark; //student mark 

    // use a public constructor to assign the values: required by 'readonly' field modifier 
    public StudentDetails(string UnitCode, string UnitNumber, string FirstName, string LastName, int StudentMark) 
    { 
     this.unitCode = UnitCode; 
     this.unitNumber = UnitNumber; 
     this.firstName = FirstName; 
     this.lastName = LastName; 
     this.studentMark = StudentMark; 
    } 
} 

Esto requiere un cambio en la forma de agregar los detalles del objeto a la matriz estudiantes:

void AddStudentDetails(string unitCode, string unitNumber, string firstName, string lastName, int studentMark) 
{ 
    students[indexer] = new StudentDetails(unitCode, unitNumber, firstName, lastName, studentMark); 

    // increment your indexer 
    indexer++; 
} 

considerar los requisitos para la estructura y el diseño de manera apropiada.

+0

Muchas gracias por la respuesta, hará que mi vida sea mucho más fácil en la próxima tarea. Por cierto. Buen punto para mantener los requisitos, va a hacer :) – n1te

Cuestiones relacionadas