如何使用嵌套 属性 使用 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??""
..
..有时最简单的问题会导致最复杂的工作! ;)
我有一个包含以下数据的 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??""
..
..有时最简单的问题会导致最复杂的工作! ;)