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