如何使用嵌套 属性 使用 LINQ 对列表进行排序

How to sort a List with LINQ using Nested Property

我有一个包含以下数据的 Json 文件:

[ 
   { "Id": 510, "Title": "Big Start", "Author": [{ "AuthId": 7777, "Name": "Tom" }] },
   { "Id": 511, "Title": "Rising Tide", "Author": [{ "AuthId": 6666, "Name": "Bob" }] }
]

针对以上,我定义如下类:

public class Book {
  public int Id { get; set; }
  public string Title { get; set; }
  public List<Author> Authors { get; set; }
 }
    
 public class Author {
  public int AuthId { get; set; }
  public string Name { get; set; }
 }

我使用以下代码反序列化了 json 数据:

List<Book> books;
 using (StreamReader sr = new StreamReader(Server.MapPath("...")))
 {
  books = JsonConvert.DeserializeObject<List<Item>>(sr.ReadToEnd()).ToList()
 }

现在我想使用作者姓名对图书列表进行排序。我尝试了以下方法:

var list = books.OrderBy(b => b.Author.OrderBy(a => a.Name)).ToList();

但我收到错误消息 'At least one object must implement IComparable'。

谁能帮我用嵌套的作者姓名对上面的列表进行排序。

提前致谢。

事实是,作者是一个列表,那么我们按哪个作者姓名排序?可能有很多。 “Alfred 和 Zeus 的 Book1”,“Zigo、Mary 和 Ada 的 Book2”——这些书是如何分类的?如果 Book2 是 Ada、Mary 和 Zigo 写的,他们如何排序?

如果只有一位作者,那很简单

var list = books.OrderBy(b => b.Authors.First().Name).ToList();

由于 authors 是一个列表,您也可以将其编入索引

var list = books.OrderBy(b => b.Authors[0].Name).ToList();

如果有不止一个作者,您需要考虑使用哪个作者进行排序。如果多个作者作为决胜局做出贡献,它会变得更加复杂。您最终可能会得到一个跳过的 ThenBy第一作者等,但是你需要考虑是否也要对作者进行排序..

请记住,c# 是区分大小写的,因此“bob”将排在“Tom”之后,而且如果这里的作者为零,则上面的代码将不起作用 - 您已经暗示总会有一个,但如果不是,考虑 FirstOrDefault()?.Name??"" ..

..有时最简单的问题会导致最复杂的工作! ;)