根据 C# 中的项目值将对象数组合并为一个对象

问题描述 投票:0回答:1

我需要根据项目值将一组对象合并为一个对象 这个想法或多或少是这样的: 我有这个C#方法

private SecurityResponse mergeSecuritySettings(SecurityResponse[] profileDetails)
{
// return merged object
}

其中 SecurityResponse[] 是一组安全配置文件,每个配置文件对于数组中的每一项都有自己的安全设置 例如:

[
  {
    "colorSettings": [
      {
        "settingKey": "A_288",
        "securitySettingValue": "R"
      },
      {
        "settingKey": "A_288_556",
        "securitySettingValue": "R"
      }
    ],
    "speedSettings": [
      {
        "settingKey": "L_19",
        "securitySettingValue": "R"
      },
      {
        "settingKey": "L_19_38",
        "securitySettingValue": "H"
      }
    ],
    "shapeSettings": [
      {
        "settingKey": "P_8",
        "securitySettingValue": "W"
      },
      {
        "settingKey": "P_8_8",
        "securitySettingValue": "W"
      }
    ],
    "brandSettings": [
      {
        "settingKey": "R_340",
        "securitySettingValue": "R"
      },
      {
        "settingKey": "R_337",
        "securitySettingValue": "H"
      }
    ]
  },
  {
  "colorSettings": [
    {
      "settingKey": "A_288",
      "securitySettingValue": "W"
    },
    {
      "settingKey": "A_288_556",
      "securitySettingValue": "W"
    }
  ],
  "speedSettings": [
    {
      "settingKey": "L_19",
      "securitySettingValue": "R"
    },
    {
      "settingKey": "L_19_38",
      "securitySettingValue": "W"
    }
  ],
  "shapeSettings": [
    {
      "settingKey": "P_8",
      "securitySettingValue": "W"
    },
    {
      "settingKey": "P_8_8",
      "securitySettingValue": "W"
    }
  ],
  "brandSettings": [
    {
      "settingKey": "R_340",
      "securitySettingValue": "R"
    },
    {
      "settingKey": "R_337",
      "securitySettingValue": "R"
    }
  ]
}
]

这里的关键是“securitySettingValue”(W = Write,R = Read,H = Hide),输出标准应该从最...到最不宽松(注意每个项目都有一个唯一的settingKey)这将在“SecurityResponse”数组的每个元素上重复),

所以...对于他从上面输入的数据,输出应该是:

{
  "colorSettings": [
    {
      "settingKey": "A_288",
      "securitySettingValue": "W"
    },
    {
      "settingKey": "A_288_556",
      "securitySettingValue": "W"
    }
  ],
  "speedSettings": [
    {
      "settingKey": "L_19",
      "securitySettingValue": "R"
    },
    {
      "settingKey": "L_19_38",
      "securitySettingValue": "W"
    }
  ],
  "shapeSettings": [
    {
      "settingKey": "P_8",
      "securitySettingValue": "W"
    },
    {
      "settingKey": "P_8_8",
      "securitySettingValue": "W"
    }
  ],
  "brandSettings": [
    {
      "settingKey": "R_340",
      "securitySettingValue": "R"
    },
    {
      "settingKey": "R_337",
      "securitySettingValue": "R"
    }
  ]
}

也许解决方案很简单,但如果不进入几个嵌套循环,我就看不到它,(主要是因为我缺乏 C# 知识)。

关于如何处理这个问题有什么建议吗?有内置方法吗?

提前致谢!

c# algorithm visual-studio merge
1个回答
0
投票

尝试这样:

使用

Serialize JSON
Deserialize JSON
,查看https://www.newtonsoft.com/json

using System;
using System.Collections.Generic;
using Newtonsoft.Json;

public class Program
{
    public class BrandSetting
    {
        public string settingKey { get; set; }
        public string securitySettingValue { get; set; }
    }

    public class ColorSetting
    {
        public string settingKey { get; set; }
        public string securitySettingValue { get; set; }
    }

    public class ShapeSetting
    {
        public string settingKey { get; set; }
        public string securitySettingValue { get; set; }
    }

    public class SpeedSetting
    {
        public string settingKey { get; set; }
        public string securitySettingValue { get; set; }
    }

    public class Root
    {
        public List<BrandSetting> brandSettings { get; set; }
        public List<ColorSetting> colorSettings { get; set; }
        public List<ShapeSetting> shapeSettings { get; set; }
        public List<SpeedSetting> speedSettings { get; set; }
    }

    public static void Main()
    {       
        /*
        // JSON Serialize
        Root root = new Root();
        
        root.brandSettings = new List<BrandSetting>();
        BrandSetting brandSetting = new BrandSetting(){
            settingKey = "1",
            securitySettingValue = "2"      
        };
        root.brandSettings.Add(brandSetting);

        root.colorSettings = new List<ColorSetting>();
        ColorSetting colorSetting = new ColorSetting(){
            settingKey = "3",
            securitySettingValue = "4"      
        };
        root.colorSettings.Add(colorSetting);

        root.shapeSettings = new List<ShapeSetting>();
        ShapeSetting shapeSetting = new ShapeSetting(){
            settingKey = "5",
            securitySettingValue = "6"      
        };
        root.shapeSettings.Add(shapeSetting);

        root.speedSettings = new List<SpeedSetting>();
        SpeedSetting speedSetting = new SpeedSetting(){
            settingKey = "7",
            securitySettingValue = "8"      
        };
        root.speedSettings.Add(speedSetting);

        string json = JsonConvert.SerializeObject(root);        
        json = "[" + json.Replace('\"', '\'') + "]";
        Console.WriteLine(json);
        Console.WriteLine("");
        */
        
        // json example
        String json = @"[{'colorSettings':[{'settingKey':'A_288','securitySettingValue':'R'},{'settingKey':'A_288_556','securitySettingValue':'R'}],'speedSettings':[{'settingKey':'L_19','securitySettingValue':'R'},{'settingKey':'L_19_38','securitySettingValue':'H'}],'shapeSettings':[{'settingKey':'P_8','securitySettingValue':'W'},{'settingKey':'P_8_8','securitySettingValue':'W'}],'brandSettings':[{'settingKey':'R_340','securitySettingValue':'R'},{'settingKey':'R_337','securitySettingValue':'H'}]},{'colorSettings':[{'settingKey':'A_288','securitySettingValue':'W'},{'settingKey':'A_288_556','securitySettingValue':'W'}],'speedSettings':[{'settingKey':'L_19','securitySettingValue':'R'},{'settingKey':'L_19_38','securitySettingValue':'W'}],'shapeSettings':[{'settingKey':'P_8','securitySettingValue':'W'},{'settingKey':'P_8_8','securitySettingValue':'W'}],'brandSettings':[{'settingKey':'R_340','securitySettingValue':'R'},{'settingKey':'R_337','securitySettingValue':'R'}]}]";

        // JSON Deserialize
        List<Root> SecurityResponses = JsonConvert.DeserializeObject<List<Root>>(json);
        //
        foreach (Root ro in SecurityResponses)
        {
            if(ro is null) {
                continue;
            }
            //
            foreach (BrandSetting bs in ro.brandSettings)
            {
                if(bs is null) {
                    continue;
                }
                Console.WriteLine("BrandSetting Key: " + bs.settingKey + " BrandSetting Value" + bs.securitySettingValue);          
            }
        }
        
        foreach (Root ro in SecurityResponses)
        {
            if(ro is null) {
                continue;
            }
            foreach (ColorSetting cs in ro.colorSettings)
            {
                if(cs is null) {
                    continue;
                }
                Console.WriteLine("ColorSetting Key: " + cs.settingKey + " ColorSetting Value" + cs.securitySettingValue);          
            }
        }

        foreach (Root ro in SecurityResponses)
        {
            if(ro is null) {
                continue;
            }
            foreach (ShapeSetting ss in ro.shapeSettings)
            {
                if(ss is null) {
                    continue;
                }
                Console.WriteLine("ShapeSetting Key: " + ss.settingKey + " ShapeSetting Value" + ss.securitySettingValue);          
            }
        }

        foreach (Root ro in SecurityResponses)
        {
            if(ro is null) {
                continue;
            }
            foreach (SpeedSetting spe in ro.speedSettings)
            {
                if(spe is null) {
                    continue;
                }
                Console.WriteLine("SpeedSetting Key: " + spe.settingKey + " SpeedSetting Value" + spe.securitySettingValue);            
            }
        }

    }
}
© www.soinside.com 2019 - 2024. All rights reserved.