[英]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.