繁体   English   中英

在 C# 中合并两个对象的有效方法

[英]Efficient way to Merge two objects in C#

我在 c# 中有两个对象。 一个用于 Header 详细信息(字典),另一个用于交易。 两者都来自不同的系统。

第一个 Object -(类型为 NameValueCollection 或存在此类映射的任何 object)

    Name: "NameOfA"
    Value : "A1"  //Name of the property in second object

    Name: : "NameOfB"
    Value: "B1"  //Name of the property in second object

    Name: : "NameOfC"
    Value: "C1"  //Name of the property in second object

    Name: : "NameOfD"
    Value: "D1"  //Name of the property in second object

第二个 Object (自定义类型/JObject) -

    "Property 1" : "Property 1 Value",
    "Property 2" : "Property 2 Value",
    "Property 3" : "Property 3 Value",
    "Property 4:  {
        [
            {
                "A1" : "Value of A1", //The key "A1" here maps to the value property of First object
                "Other Property 1" : "Value of other property 1",
                "Other Property 2" : "Value of other property 2",
                "Other Property 3" : 100
            },
            
            {
                "B1" : "Value of B1",
                "Other Property 1" : "Value of other property 1",
                "Other Property 2" : "Value of other property 2",
                "Other Property 3" : 100
            },

            {
                "C1" : "Value of C1",
                "Other Property 1" : "Value of other property 1",
                "Other Property 2" : "Value of other property 2",
                "Other Property 3" : 100
            },
            {
                "D1" : 100; // Value of D1
                "Other Property 1" : "Value of other property 1",
                "Other Property 2" : "Value of other property 2",
                "Other Property 3" : 100
            },
                
        ]
    
    }

两个 object 之间的关系是,First object 的值是 Second object 中的Key (在子数组中)。

例如 -值:“A1” ,第一个 object 的值“A1”是第二个 object 的关键:

"Property 4:  {
        [
            {
                *"A1"* : "Value of A1": 

我想一起处理这两个对象,所以我可以得到以下格式:

[
        {
            "NameOfTask": "NameOfA",   // Name property of first object
            "ValueOfTask": "Value of A1" //Value of Property A1 in second object
        },

        {
            "NameOfTask": "NameOfB",
            "ValueOfTask": "Value of B1"
        },

        {
            "NameOfTask": "NameOfC",
            "ValueOfTask": "Value of C1"
        },

        {
            "NameOfTask": "NameOfD",
            "ValueOfTask": 100
        }


    ]

处理这两个不同的 object 的最快算法可能是什么,因为 object 结构是完全自定义的,在我的第一个 object 中可能有 100 条记录,第二条记录可能有 1000 条。

提前致谢。

您可以使用Dictionary<>临时存储两个对象之间的映射。 如果第一个 Object 小于第二个 Object,我建议存储第一个对象的信息。 否则,反其道而行之。

为清楚起见,以下是我设置这两个对象的方式:

var firstObject = new NameValueCollection();
firstObject.Add("NameOfA", "A1");
firstObject.Add("NameOfB", "B1");
firstObject.Add("NameOfC", "C1");
firstObject.Add("NameOfD", "D1");

var secondObject = JObject.ReadFrom(tr); // tr contains your JSON

现在让我们构建中间结构。 尽管NameValueCollection允许每个键存储多个值,但我假设您只使用第一个条目。 第二步,我们需要能够按值查找名称。 所以,我们建立这个字典:

var keyToName = new Dictionary<string, string>();
for (int i = 0; i < firstObject.Count; ++i )
{
    keyToName.Add(firstObject.GetValues(i)[0], firstObject.GetKey(i));
}

然后我们需要从第二个 Object 中提取所有属性。 我使用这个 function 递归地执行此操作:

void ProcessToken(JToken json, Dictionary<string, string> keyToName, NameValueCollection firstObject)
{
    if (json.Type == JTokenType.Property)
    {
        var prop = (JProperty)json;
        // update firstObject here
    }


    foreach (var item in json.Children())
    {
        ProcessToken(item, keyToName, firstObject);
    }
}

第一个 object 的实际更新必须放在注释行。 在那里,我们需要检查是否有对应于该属性的条目。 如果我们这样做,请更新它:

var hasKey = keyToName.TryGetValue(prop.Name, out string key);
if(hasKey)       
{
    // replace value
    firstObject.Remove(key);
    firstObject.Add(key, prop.Value.ToString());
}

就是这样。 这是一些演示 output:

Collection before processing:
NameOfA: A1
NameOfB: B1
NameOfC: C1
NameOfD: D1

Collection after processing:
NameOfA: Value of A1
NameOfB: Value of B1
NameOfC: Value of C1
NameOfD: 100;

如果您需要其他数据结构中的最终结果,请随意调整代码。 核心原则始终相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM