如何根据列表的子对象属性对列表进行排序?

时间:2019-02-06 15:31:10

标签: c# list linq generics

我想知道是否有人可以阐明一种基于子对象的属性对对象列表进行排序的方法。 我正在使用以下模型:

public class Content
{
    public string Id { get; set; }
    public List<ContentAttribute> Attributes { get; set; }
}

public class ContentAttribute
{
    public string Value { get; set; }
    public string Id { get; set; }
    public string Name { get; set; }
}

一些示例数据:

[
    {
        "Id": "123",
        "Attributes": [
            {
                "Value": "abc",
                "Id": "1a",
                "Name": "name1"
            },
            {
                "Value": "ghi",
                "Id": "2b",
                "Name": "name2"
            }
        ]
    },
    {
        "Id": "456",
        "Attributes": [
            {
                "Value": "abc",
                "Id": "1a",
                "Name": "name2"
            },
            {
                "Value": "def",
                "Id": "2b",
                "Name": "name3"
            }
        ]
    },
    {
        "Id": "789",
        "Attributes": [
            {
                "Value": "abc",
                "Id": "1a",
                "Name": "name1"
            },
            {
                "Value": "def",
                "Id": "2b",
                "Name": "name2"
            }
        ]
    }
]

如何按特定属性Value的{​​{1}}对Content对象排序?例如,我想按“ name2”的Name对以上数据进行排序, 表示结果将是

Value

任何帮助将不胜感激。 (使用c#)。

1 个答案:

答案 0 :(得分:4)

如果Attributes始终有一个名称为name2的元素,而您想要一个异常,则它不是:

var sorted = contents.OrderBy(c => c.Attributes.First(a => a.Name == "name2").Value).ToList();

或者如果name2可能丢失并且不是交易破坏者,请使用FirstOrDefault

var sorted = contents.OrderBy(c => c.Attributes.FirstOrDefault(a => a.Name == "name2")?.Value).ToList();