我在按字母StudentName
排序学生时遇到问题。
List<Student> studentList = new List<Student>() {
new Student() { StudentID = 1, StudentName = "John", Age = 18, Country = "Poland" } ,
new Student() { StudentID = 2, StudentName = "Steve", Age = 22, Country = "Poland" } ,
new Student() { StudentID = 3, StudentName = "Bill", Age = 18, Country = "USA" } ,
new Student() { StudentID = 4, StudentName = "Ram" , Age = 20, Country = "USA" } ,
new Student() { StudentID = 5, StudentName = "Ron" , Age = 21, Country = "Germany" }
};
var listAlphabetically = studentList.OrderBy(x=>x.StudentName);
Console.WriteLine(listAlphabetically);
如果未提供字符串,则类似WriteLine的函数将调用var listAlphabetically = studentList.OrderBy(x => x.StudentName);
foreach (var student in listAlphabetically)
{
Console.WriteLine($"Name: {student.StudentName}, Age: {student.Age}, Country: {student.Country}");
}
。并且该方法的默认实现是打印类名。没有自动为您打印数组或枚举器的内容。 (即使存在,学生类也可能不会覆盖Name: Bill, Age: 18, Country: USA
Name: John, Age: 18, Country: Poland
Name: Ram, Age: 20, Country: USA
Name: Ron, Age: 21, Country: Germany
Name: Steve, Age: 22, Country: Poland
。)
如果要打印数组内容,则必须自己动手编写它并调用适当的属性:
ToString()
当然,在这种情况下,您想通过命令代替枚举器:
ToString()
或使用其他人的循环,例如使用James LINQ Join解决方案。
当前,您正在尝试使用foreach(Student current in studentList ){
Console.WriteLine(current.StudentName);
}
将列表对象打印到控制台。
foreach(Student current in listAlphabetically){
Console.WriteLine(current.StudentName);
}
Console.WriteLine()
内部调用列表对象的var listAlphabetically = studentList.OrderBy(x => x.StudentName);
Console.WriteLine(listAlphabetically);
方法。然后,对象变成其Console.WriteLine()
表示形式,在您的情况下,该外观可能看起来像.ToString()
。
要覆盖对象string
-表示,您需要自己定义System.Linq.OrderedEnumerable2[StackOverflow.Program+Student,System.String]
方法。因此,示例如下所示:
string
然后,您将可以迭代.ToString()
的列表并将其表示打印到控制台:
public class Student
{
public int StudentID { get; set; }
public string StudentName { get; set; }
public int Age { get; set; }
public string Country { get; set; }
public override string ToString()
{
return $"StudentID: {this.StudentID} - StudentName: {this.StudentName} - Age: {this.Age} - Country: {this.Country}";
}
}
如果只想将每个学生的单个属性打印到控制台,则可以通过打印特定属性值来做到这一点:
var listAlphabetically = studentList.OrderBy(x => x.StudentName);
//迭代学生并仅打印每个学生的IDforeach(列表中的var学生,按字母顺序排列)Console.WriteLine(student.StudentID);
完整示例
Student
注
不要忘记导入var listAlphabetically = studentList.OrderBy(x => x.StudentName);
// iterate students and print them to the console
foreach (var student in listAlphabetically)
Console.WriteLine(student);
和using System;
using System.Collections.Generic;
using System.Linq;
namespace StackOverflow
{
public class Program
{
public class Student
{
public int StudentID { get; set; }
public string StudentName { get; set; }
public int Age { get; set; }
public string Country { get; set; }
public override string ToString()
{
return $"StudentID: {this.StudentID} - StudentName: {this.StudentName} - Age: {this.Age} - Country: {this.Country}";
}
}
private static void Main(string[] args)
{
List<Student> studentList = new List<Student>() {
new Student() { StudentID = 1, StudentName = "John", Age = 18, Country = "Poland" } ,
new Student() { StudentID = 2, StudentName = "Steve", Age = 22, Country = "Poland" } ,
new Student() { StudentID = 3, StudentName = "Bill", Age = 18, Country = "USA" } ,
new Student() { StudentID = 4, StudentName = "Ram" , Age = 20, Country = "USA" } ,
new Student() { StudentID = 5, StudentName = "Ron" , Age = 21, Country = "Germany" }
};
var listAlphabetically = studentList.OrderBy(x => x.StudentName);
// iterate students and print them to the console
foreach (var student in listAlphabetically)
Console.WriteLine(student);
// keep console open
Console.ReadKey();
}
}
}
,因为您将需要它们来执行上述代码。
System.Collections.Generic