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

Posted

技术标签:

【中文标题】如何使用 LINQ 使用嵌套属性对列表进行排序【英文标题】:How to sort a List with LINQ using Nested Property 【发布时间】:2021-11-15 13:43:29 【问题描述】:

我有一个包含以下数据的 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();

但我收到错误消息“至少一个对象必须实现 IComparable”。

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

提前致谢。

【问题讨论】:

就我而言,列表中总会有一位作者。因此,查看上面的 json 数据,ID 为 511 的记录将列在 510 之前,因为“Bob”在“Tom”之前。我希望这可以澄清。谢谢。 【参考方案1】:

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

如果只有一个作者,那就很简单了

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

由于作者是一个列表,您也可以对其进行索引

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

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

请记住,c# 是区分大小写的,因此“bob”将在“Tom”之后排序,如果这里的作者为零,上面的代码也将不起作用 - 你暗示总会有一个,但如果不是,请考虑 @ 987654323@..

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

【讨论】:

天才。像魅力一样工作。非常感谢。 感谢 0 个作者的额外提示,FirstOrDefault()。这样就更清楚了。

以上是关于如何使用 LINQ 使用嵌套属性对列表进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 orderBy 对嵌套的 Linq 对象进行排序

如何按整数属性对类列表进行排序? [复制]

如何按 .NET 2.0 中的特定属性对列表进行排序? [复制]

如何使用 linq 查询具有嵌套列表的对象?

使用动态 LINQ 按一个或多个属性对 JSON 进行排序

如何一次对字典或列表中的所有嵌套字典和列表进行排序?