【问题标题】:How to filter a flattened LINQ result in C#如何在 C# 中过滤扁平化的 LINQ 结果
【发布时间】:2023-03-04 05:27:01
【问题描述】:

我有一个 JSON 响应,其中包含几个作业的列表,每个作业都可以有标签,标签由键/值对组成,其中值是值列表。我正在尝试在 C# 中形成一个 LINQ 查询,该查询返回一个作业 ID 列表,其中每个作业都有一个带有 Key="Area" 的标签,并且值包含 "Test"。

我已经成功地将 JSON 反序列化为类,但是我是 LINQ 新手,并且已经花费了大量时间来试验和谷歌搜索可能的解决方案,但无济于事。

样本数据:

    {
    jobs: [
        {
            id: 1
            tags: [
                {
                    key: "Area"
                    values: [ "TEST", "SHIP" ]
                }
        }
        {
            id: 2
            tags: [
                {
                    key: "Area"
                    values: [ "BUILD" ]
                }
        }
        {
            id: 3
            tags: [
                {
                    key: "Area"
                    values: [ "INSPECT", "TEST", "SHIP" ]
                }
                {
                    key: "Status"
                    values: [ "HOLD", "SPECIAL" ]
                }
        }
        {
            id: 4
            tags: [
                {
                    key: "Area"
                    values: [ "BUILD", "TEST" ]
                }
        }]
    }

类结构:

    public class Tag
        {
        public string key { get; set; }
        public List<string> values { get; set; }
        }

    public class Job
        {
        public int id { get; set; }
        public List<Tag> tags { get; set; }
        }

所以我想要的是 Job.id 列表,其中 job.tags 包含 Tag 其中 Tag.values 包含“测试”。在这个示例中,

1
3
4

任何 LINQ 专家都知道如何解决这个问题?

【问题讨论】:

    标签: c# json linq flatten


    【解决方案1】:
    var result = jobs.Where(j =>    j.tags != null 
                                 && j.tags.Any(t =>   t.key.Equals("Area") 
                                                   && t.values.Contains("TEST")))
                     .Select( x => x.id)
                     .ToList();
    

    result 将是 List of int,包含 1,3,4

    【讨论】:

    • MacKey 指出t.values.Contain( 应该是t.values.Contains(,但没有足够的代表发表评论。
    • @seanskelly & mackey 是的,你是对的。已编辑。谢谢
    • 这似乎在沙箱中工作,但是当我在没有任务的作业中运行时遇到异常。根据调用堆栈,Any 方法似乎不能采用空值。
    • @DaveNicks 是的,如果j.tags 为空,那么Any() 将抛出异常。但是添加一个空检查将解决它。查看已编辑的答案。您可能需要为 t.keyt.values 添加类似的空检查
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 2017-11-16
    • 2022-01-23
    • 2011-11-15
    • 2010-12-08
    • 1970-01-01
    相关资源
    最近更新 更多