C# C语言中的结构数组#

C# C语言中的结构数组#,c#,arrays,struct,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];

我正在尝试使用结构数组从用户处获取输入,然后打印它:

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
    }

}
}
它没有崩溃,只是我输入的数据没有得到上面5行

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

有人能帮助我,告诉我如何在上面的例子中正确使用structs吗。谢谢

干杯


n1te

您需要适当地打印结构的成员。我建议使用一种方法,在给定结构的情况下为您进行打印,例如

public void PrintStruct(StudentDetails stDetails)
{
    Console.WriteLine(stDetails.firstName);
    Console.WriteLine(stDetails.lastName);
    .... etc
}
或者创建一个类(这是C#)并重写ToString()方法以返回一个包含所有成员信息的字符串,而无需修改主代码


结构可以在C中使用,但如果您需要数据表示而不仅仅是简单的数据传输,则不应使用类。

这是因为默认情况下
ToString()
返回类型名,您必须为
StudentDetails
struct:

public struct StudentDetails
{    
  public override void ToString()
  {
     return String.Format(
                CultureInfo.CurrentCulture,
               "FirstName: {0}; LastName: {1} ... ", 
                this.FirstName,
                this.LastName);
  }
}
顺便说一句,为什么要使用stuct和legacy阵列?考虑使用<代码>类< /代码>代替<代码>结构> <代码>和泛型<代码> IIST< <代码>或<代码> IDICORION<代码>而不是数组。
因为传统数组和结构(基本上是值类型)在每次向数组添加项并在读回时取消装箱(对象->结构)时都会引入装箱(结构->对象)隐式调用StudentDetails结构的ToString()方法,默认情况下,该方法只写出结构类型的名称。重写ToString()方法:

然而,更大的问题是您正在设置5个不同StudentDetails结构的属性。。。通过声明数组
StudentDetails[,]student=newstudentdetails[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();

...
然后写出来:

Console.WriteLine("{0}", student);
这将使用您在StudentDetails结构中声明的ToString()方法。(每当需要将对象转换为字符串时,就会调用ToString(),您不必总是编写它)


希望这有帮助。

其他人已经介绍了对
ToString()的重写,所以我不会重复这些信息。更重要的是,应您的要求:

有人能帮助我并告诉我如何在上面的示例中正确使用structs。

首先,您的结构是可变的。不可变结构并不总是最好的解决方案,但应该考虑……请参阅我关于Microsoft使用的帖子。也就是说,我将确定基本需求:结构是否需要可变性?换句话说,学生的姓名、单元号或标记在结构实例化后会发生变化吗

其次,如果要求收集
StudentDetails
,则可以使用数组:

//    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++;
}
注:本例不考虑异常处理;e、 例如,增量超出数组的边界

在上一个示例中,您可以在实例化后更改
StudentDetails
结构的任何属性。不可变时,结构更安全:

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;
    }
}
这需要更改将details对象添加到students数组的方式:

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++;
}

适当地考虑结构和设计的需求。

次要的挑剔:字符串生成器是一项没有收益的大量工作。只需使用串联或单个
string.Format()
。首先感谢大家的及时响应。老实说,我不必在这里使用数组,但下一个赋值类似,我需要在那里使用数组,所以我想练习一下。在下一个作业中,我必须接受以下数据:周数、主队名称、客队名称、胜利(1或0)_italic_您的程序必须使用结构数组将数据存储在内存中,即您的程序必须将文件中的数据作为结构数组读取到内存中,并操作数组中的数据。总共将有5周和80场比赛(共有16支球队),这就是为什么我认为我会在这里试一试,以便在下一个任务中更容易@Nick Bradley没关系,只要你明白,在你发布的原始代码中,你没有填写StudentDetails结构-你填写了五个不同的结构,但是你只在第一个结构中填写了unitCode(在[0,0]),在第二个结构中填写了unitNumber(在[1,0]),在第三个结构中填写了firstName。。等等。您没有完全填写所做的任何StudentDetails结构。@n1te:请遵守当前作业的要求。虽然这表明你渴望学习,但不遵守要求可能会对你的成绩产生负面影响我同意尼克的看法。您可能需要的是一个一维StudenDetails数组<代码>学生[0]。firstName=“Mickey”;学生[0]。lastName=“鼠标”“但在需要数据表示而不仅仅是简单的数据传输的情况下,不应该使用类。”…不总是正确的。;)非常感谢你的回答,这将使我的生活在下一个任务更容易。顺便说一句,保持要求很好,可以:)
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;
    }
}
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++;
}