【问题标题】:How do I sort a list based on its child object attributes?如何根据子对象属性对列表进行排序?
【发布时间】:2019-06-30 14:45:19
【问题描述】:

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

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"
            }
        ]
    }
]

如何按特定属性NameValue 对内容对象进行排序?比如我想按照'name2'的Value对上面的数据进行排序, 意味着结果将是

[
    {"Id" : "456"},
    {"Id" : "789"},
    {"Id" : "123"}
]

非常感谢任何帮助。 (使用 c#)。

【问题讨论】:

  • "我想按照'name2'的值对上面的数据进行排序" 这是什么意思?您说要按特定值排序。那没有意义。这就像说,我想按数字 7 对这个列表进行排序。
  • 在数据上下文中,“name2”的值将是“abc”、“def”和“ghi”。希望能解决这个问题。

标签: c# list linq generics


【解决方案1】:

如果 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();

【讨论】:

  • 如果您想安全起见,可以使用:c.Attributes.FirstOrDefault(a =&gt; a.Name == "name2")?.Value
  • 我会添加它作为额外的方式,因为异常可能是确定您现在没有的错误的一种方式。
猜你喜欢
  • 2022-01-11
  • 2022-01-05
  • 1970-01-01
  • 2021-06-27
相关资源
最近更新 更多