簡體   English   中英

如何以遞歸方式在對象子級列表中找到所有對象?

[英]How can I find all of objects in a list of an object's child recursively?

我有一個需要處理的對象。 此對象的類型為SchemaValidationResults ,其中包含列表List<SchemaValidationResults> NestedResults ,該List<SchemaValidationResults> NestedResults可能包含也可能不包含其他SchemaValidationResults對象。

為了更清楚地說明這一點,我在下面提供了JSON表示形式。 在此JSON表示中包含一個父對象,該父對象包含一個子對象,該子對象具有兩個子對象。 這些子對象之一具有另一個子對象。

因此,我們有:

Parent
     Child
          Child
          Child
               Child

我需要能夠在此JSON表示形式中檢索沒有任何其他子代的對象。 因此,在上述結構中,我需要這兩個孩子。

Parent
     Child
          Child <-- Need
          Child
               Child <- Need

JSON格式

{
  "valid": false,
  "keywordLocation": "#/properties/form_submission/properties/sections/properties",
  "instanceLocation": "#/form_submission/sections",
  "keyword": "properties",
  "errors": [
    {
      "valid": false,
      "keywordLocation": "#/properties/form_submission/properties/sections/properties/6/properties/questions",
      "instanceLocation": "#/form_submission/sections/6/questions",
      "errors": [
        {
          "valid": false,
          "keywordLocation": "#/properties/form_submission/properties/sections/properties/6/properties/questions/properties/102/$ref/properties/answer/type",
          "instanceLocation": "#/form_submission/sections/6/questions/102/answer",
          "keyword": "type",
          "additionalInfo": {
            "expected": "string",
            "actual": "number"
          }
        },
        {
          "valid": false,
          "keywordLocation": "#/properties/form_submission/properties/sections/properties/6/properties/questions/allOf",
          "instanceLocation": "#/form_submission/sections/6/questions",
          "keyword": "allOf",
          "errors": [
            {
              "valid": false,
              "keywordLocation": "#/properties/form_submission/properties/sections/properties/6/properties/questions/allOf/0/else/properties/100/properties/answer/maxLength",
              "instanceLocation": "#/form_submission/sections/6/questions/100/answer",
              "keyword": "maxLength",
              "additionalInfo": {
                "expected": 0,
                "actual": 2
              }
            }
          ]
        }
      ]
    }
  ]
}

這種性質使我相信遞歸將能夠幫助我創建一個沒有更多子代的所有子代對象的列表。

但是,我開始寫一個方法,我很快意識到我不確定如何構造該方法以實現所需的結果。 到目前為止,我有這個:

public List<SchemaValidationResults> GetChildLessError(SchemaValidationResults errors)
        {
            List<SchemaValidationResults> childLessErrors = new List<SchemaValidationResults>();

            foreach(var result in errors.NestedResults)
            {
                if(result.NestedResults.Count == 0)
                {
                    childLessErrors.Add(result);
                }
                else
                {
                    foreach(var resultChild in result.NestedResults)
                    childLessErrors.AddRange(GetChildLessError(resultChild));
                }
            }

            return childLessErrors;
        }

這種方法很有效,它產生的對象列表中沒有任何子對象,但是我所期望的10個對象中,只有6個對象。

下面是我正在運行此方法的完整JSON文件。 第一個JSON文件只是一個片段。

{
  "valid": false,
  "keywordLocation": "#/properties/form_submission/properties/sections/properties",
  "instanceLocation": "#/form_submission/sections",
  "keyword": "properties",
  "errors": [
    {
      "valid": false,
      "keywordLocation": "#/properties/form_submission/properties/sections/properties/1/properties/questions/properties/3/$ref/properties/answer/enum",
      "instanceLocation": "#/form_submission/sections/1/questions/3/answer",
      "keyword": "enum"
    },
    {
      "valid": false,
      "keywordLocation": "#/properties/form_submission/properties/sections/properties/6/properties/questions",
      "instanceLocation": "#/form_submission/sections/6/questions",
      "errors": [
        {
          "valid": false,
          "keywordLocation": "#/properties/form_submission/properties/sections/properties/6/properties/questions/properties/102/$ref/properties/answer/type",
          "instanceLocation": "#/form_submission/sections/6/questions/102/answer",
          "keyword": "type",
          "additionalInfo": {
            "expected": "string",
            "actual": "number"
          }
        },
        {
          "valid": false,
          "keywordLocation": "#/properties/form_submission/properties/sections/properties/6/properties/questions/allOf",
          "instanceLocation": "#/form_submission/sections/6/questions",
          "keyword": "allOf",
          "errors": [
            {
              "valid": false,
              "keywordLocation": "#/properties/form_submission/properties/sections/properties/6/properties/questions/allOf/0/else/properties/100/properties/answer/maxLength",
              "instanceLocation": "#/form_submission/sections/6/questions/100/answer",
              "keyword": "maxLength",
              "additionalInfo": {
                "expected": 0,
                "actual": 2
              }
            },
            {
              "valid": false,
              "keywordLocation": "#/properties/form_submission/properties/sections/properties/6/properties/questions/allOf/1/else/properties/101/properties/answer/maxLength",
              "instanceLocation": "#/form_submission/sections/6/questions/101/answer",
              "keyword": "maxLength",
              "additionalInfo": {
                "expected": 0,
                "actual": 3
              }
            },
            {
              "valid": false,
              "keywordLocation": "#/properties/form_submission/properties/sections/properties/6/properties/questions/allOf/4/else/properties/104/properties/answer/maxLength",
              "instanceLocation": "#/form_submission/sections/6/questions/104/answer",
              "keyword": "maxLength",
              "additionalInfo": {
                "expected": 0,
                "actual": 5
              }
            }
          ]
        }
      ]
    },
    {
      "valid": false,
      "keywordLocation": "#/properties/form_submission/properties/sections/properties/8/properties/questions",
      "instanceLocation": "#/form_submission/sections/8/questions",
      "errors": [
        {
          "valid": false,
          "keywordLocation": "#/properties/form_submission/properties/sections/properties/8/properties/questions/properties/191/$ref/properties/answer",
          "instanceLocation": "#/form_submission/sections/8/questions/191/answer",
          "errors": [
            {
              "valid": false,
              "keywordLocation": "#/properties/form_submission/properties/sections/properties/8/properties/questions/properties/191/$ref/properties/answer/minLength",
              "instanceLocation": "#/form_submission/sections/8/questions/191/answer",
              "keyword": "minLength",
              "additionalInfo": {
                "expected": 1,
                "actual": 0
              }
            },
            {
              "valid": false,
              "keywordLocation": "#/properties/form_submission/properties/sections/properties/8/properties/questions/properties/191/$ref/properties/answer/enum",
              "instanceLocation": "#/form_submission/sections/8/questions/191/answer",
              "keyword": "enum"
            }
          ]
        },
        {
          "valid": false,
          "keywordLocation": "#/properties/form_submission/properties/sections/properties/8/properties/questions/allOf/12/else/properties/191/properties/answer/enum",
          "instanceLocation": "#/form_submission/sections/8/questions/191/answer",
          "keyword": "enum"
        }
      ]
    },
    {
      "valid": false,
      "keywordLocation": "#/properties/form_submission/properties/sections/properties/9/properties/questions/allOf",
      "instanceLocation": "#/form_submission/sections/9/questions",
      "keyword": "allOf",
      "errors": [
        {
          "valid": false,
          "keywordLocation": "#/properties/form_submission/properties/sections/properties/9/properties/questions/allOf/0/else/properties/211/properties/answer/maxLength",
          "instanceLocation": "#/form_submission/sections/9/questions/211/answer",
          "keyword": "maxLength",
          "additionalInfo": {
            "expected": 0,
            "actual": 12
          }
        },
        {
          "valid": false,
          "keywordLocation": "#/properties/form_submission/properties/sections/properties/9/properties/questions/allOf/1/else/properties/240/properties/answer/maxLength",
          "instanceLocation": "#/form_submission/sections/9/questions/240/answer",
          "keyword": "maxLength",
          "additionalInfo": {
            "expected": 0,
            "actual": 4
          }
        }
      ]
    }
  ]
}

您的一個循環太多。

這是您代碼的修訂版:

public List<SchemaValidationResults> GetChildLessError(SchemaValidationResults errors)
{
    List<SchemaValidationResults> childLessErrors = new List<SchemaValidationResults>();

    if(errors.NestedResults.Any())
    {
        foreach(var resultChild in errors.NestedResults)
        {
            childLessErrors.AddRange(GetChildLessError(resultChild));
        }
    }
    else
    {
        childLessErrors.Add(errors);                    
    }
    return childLessErrors;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM