我正在尝试使用结构数组从用户那里获得输入然后打印它:
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
这是因为默认情况下会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).
您的调用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(),但您不必总是编写它)
希望这可以帮助。
| 归档时间: |
|
| 查看次数: |
14008 次 |
| 最近记录: |