在c#中按名称排序学生列表

问题描述 投票:0回答:3

我在按字母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);

c# list sorting alphabetical
3个回答
1
投票

OrderBy返回OrderBy。您必须遍历它:

IOrderedEnumerable

输出:

IOrderedEnumerable

1
投票

如果未提供字符串,则类似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解决方案。


0
投票

当前,您正在尝试使用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
© www.soinside.com 2019 - 2024. All rights reserved.