如何使用 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 使用嵌套属性对列表进行排序的主要内容,如果未能解决你的问题,请参考以下文章