如何在C#中对Book类列表按书名和日期排序?
问题描述
我定义了名为Book的类,包含两个属性:BookName(字符串类型)和BookDate(DateTime类型),代码如下:
public class Book { public string BookName { get; set; } public DateTime BookDate { get; set; } }
在Main方法中创建了该类的实例列表,可通过foreach循环正常输出元素,代码如下:
List<Book> books = new List<Book>(); DateTime firstBookTime = new(2011, 02, 02, 2, 2, 2); DateTime secondBookTime = new(2012, 02, 02, 2, 2, 2); Book firstBook = new() { BookName = "firstBook", BookDate = firstBookTime }; Book secondBook = new() { BookName = "secondBook", BookDate = secondBookTime }; books.Add(firstBook); books.Add(secondBook); foreach (Book bookList in books) { Console.WriteLine ( $"name is : {bookList.BookName}" + $" and date : is {bookList.BookDate} " ); }
目前能正常输出列表元素,但尝试以下几种排序方式均未得到预期结果:
books.Sort((x, y) => string.Compare(x.BookName, x.BookName)); books = books.OrderBy(item => item.BookDate).ToList(); books.Sort();
请问如何实现按BookName字母顺序排序,以及按BookDate从新到旧排序?
解决方案
先明确你之前尝试的排序代码无效的原因:
books.Sort((x, y) => string.Compare(x.BookName, x.BookName)):始终比较同一个对象的BookName,结果永远为0,等于没做排序。books.Sort():Book类未实现IComparable<Book>接口,默认排序逻辑无法识别两个Book对象的比较规则,会直接抛出异常。books.OrderBy(item => item.BookDate).ToList():这是按BookDate升序(旧到新)排序,和你要的“从新到旧”方向相反。
1. 按BookName字母顺序排序
有两种常用实现方式:
方式一:使用List.Sort传入正确比较器
// 字母升序(a-z) books.Sort((x, y) => string.Compare(x.BookName, y.BookName)); // 字母降序(z-a),调换x和y的位置即可 books.Sort((x, y) => string.Compare(y.BookName, x.BookName));
方式二:使用LINQ的OrderBy/OrderByDescending
// 字母升序 books = books.OrderBy(book => book.BookName).ToList(); // 字母降序 books = books.OrderByDescending(book => book.BookName).ToList();
2. 按BookDate从新到旧排序
从新到旧属于降序排序,对应两种实现方式:
方式一:使用List.Sort
books.Sort((x, y) => y.BookDate.CompareTo(x.BookDate));
通过y.BookDate.CompareTo(x.BookDate)让更大的日期值(更新的日期)排在前面。
方式二:使用LINQ的OrderByDescending
books = books.OrderByDescending(book => book.BookDate).ToList();
如果需要按旧到新排序,替换为OrderBy(book => book.BookDate)即可。
如果需要给Book类设置默认排序规则,可实现IComparable<Book>接口,比如默认按BookName升序排序:
public class Book : IComparable<Book> { public string BookName { get; set; } public DateTime BookDate { get; set; } public int CompareTo(Book other) { if (other == null) return 1; return string.Compare(this.BookName, other.BookName); } }
之后直接调用books.Sort()就会按默认规则排序。
内容的提问来源于stack exchange,提问作者behnami454
相关产品推荐
相关产品推荐

