You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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从新到旧排序?

解决方案

先明确你之前尝试的排序代码无效的原因:

  1. books.Sort((x, y) => string.Compare(x.BookName, x.BookName)):始终比较同一个对象的BookName,结果永远为0,等于没做排序。
  2. books.Sort():Book类未实现IComparable<Book>接口,默认排序逻辑无法识别两个Book对象的比较规则,会直接抛出异常。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 16:02:51