C#中的结构数组

n1t*_*1te 6 c# arrays struct

我正在尝试使用结构数组从用户那里获得输入然后打印它:

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
    }

}
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,输入所有数据后我得到:

CA4.Program+StudentDetails

CA4.Program+StudentDetails

CA4.Program+StudentDetails

CA4.Program+StudentDetails

CA4.Program+StudentDetails
Run Code Online (Sandbox Code Playgroud)

它不会崩溃,只是代替我输入的数据获得上述5行.

我知道它不起作用的原因是我没有正确使用结构,因为没有它们没有问题.

有人可以帮助我,并告诉我如何在上面的例子中使用结构.谢谢

干杯,

n1te

sll*_*sll 5

这是因为默认情况下会ToString()返回一个Type名称,您必须自己为StudentDetailsstruct 覆盖它:

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

顺便说一句,你为什么使用stuct和传统阵列?考虑使用,class而不是struct通用IList<StudentDetails>IDictionary<int, StudentDetails>代替数组.因为遗留数组与struct(基本上是值类型)一起引入了一个装箱(struct - > object),每次你将数据添加到数组并在读取它时取消装箱(object - > struct).

  • 轻微的挑剔:字符串构建器是很多工作,没有收获.只需使用连接或单个`string.Format()`. (3认同)

Nic*_*k B 3

您的调用Console.WriteLine("{0} ", student[row, column]);是隐式调用 StudentDetails 结构的 ToString() 方法,该方法默认只写出结构类型的名称。重写 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,更大的问题是,您正在设置 5 个不同 StudentDetails 结构的属性...通过声明一个数组StudentDetails[,] student = new StudentDetails[5, 1];并要求用户输入有关数组中不同点的结构的详细信息,即student[0, 0]student[1,0]您不会创建一个StudentDetails 对象并设置其属性,您创建了 5 个不同的StudentDetails 对象。

你为什么使用数组?如果您希望用户填写单个 StudentDetails 对象,只需执行以下操作

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();

...
Run Code Online (Sandbox Code Playgroud)

然后把它写出来:

Console.WriteLine("{0}", student);
Run Code Online (Sandbox Code Playgroud)

这将使用您在 StudentDetails 结构中声明的 ToString() 方法。(每当需要将对象转换为字符串时,都会调用 ToString(),但您不必总是编写它)

希望这可以帮助。