我发现很难实现一种逻辑来检查一个文件中的某个键值(一起)在另一个文件中是否具有实际上完全相似的键值
我有一个如下文件,
[
{
"IdInOne": "001",
"NameInOne": "Name_2"
},
{
"IdInOne": "002",
"NameInOne": "Name_3"
}
]
另一个为
[
{
"IdInTwo": "001",
"NameInTwo": "Name_1"
},
{
"IdInTwo": "001",
"NameInTwo": "Name_2"
},
{
"IdInTwo": "001",
"NameInTwo": "Name_3"
},
{
"IdInTwo": "002",
"NameInTwo": "Name_4"
}
]
在此示例中,存在一个条目,其中“ IdInOne”:“ 001”,“ NameInOne”:“ Name_2”与第二个JSON文件中的完全相同的值匹配。因此,在这种情况下,我将打印成功消息
但是在第二个JSON文件中没有匹配项,其中“ IdInOne”:“ 002”,“ NameInOne”:“ Name_3”,因此我想在控制台中打印不成功的消息
有人可以帮我吗?对我需要什么样的算法有任何想法吗?
您首先可以创建两个表示JSON的模型类:
public class One
{
public string IdInOne { get; set; }
public string NameInOne { get; set; }
}
public class Two
{
public string IdInTwo { get; set; }
public string NameInTwo { get; set; }
}
然后使用Newtonsoft Json.NET使用这些类反序列化JSON。由于我们正在处理JSON数组,因此我们可以反序列化为List<T>
。
var json1 = "[{\"IdInOne\": \"001\",\"NameInOne\": \"Name_2\"},{\"IdInOne\": \"002\",\"NameInOne\": \"Name_3\"}]";
var json2 = "[{\"IdInTwo\": \"001\",\"NameInTwo\": \"Name_1\"},{\"IdInTwo\": \"001\",\"NameInTwo\": \"Name_2\"},{\"IdInTwo\": \"001\",\"NameInTwo\": \"Name_3\"},{\"IdInTwo\": \"002\",\"NameInTwo\": \"Name_4\"}]";
var deserializedJson1 = JsonConvert.DeserializeObject<List<One>>(json1);
var deserializedJson2 = JsonConvert.DeserializeObject<List<Two>>(json2);
然后您可以使用LINQ的Any()
进行简单比较:
Any()
哪个输出:
foreach (var one in deserializedJson1)
{
if (deserializedJson2.Any(two => two.IdInTwo == one.IdInOne &&
two.NameInTwo == one.NameInOne))
{
Console.WriteLine($"Match found with {one.IdInOne} and {one.NameInOne}");
} else
{
Console.WriteLine($"No match found with {one.IdInOne} and {one.NameInOne}");
}
}
另一种实现方式可能是反序列化为元组,然后将twos转换为Match found with 001 and Name_2
No match found with 002 and Name_3
并将其用于查找。拥有哈希集可以改善从O(N)到O(1)的查找,并可以提高较大数据集的性能。 HashSet<T>
是O(1)方法。
HashSet<T>.Contains(T)
使用Newtonsoft并使用POCO类来解析您的两个模型,然后比较两个实例的属性。
请参阅此示例以了解如何反序列化json
HashSet<T>.Contains(T)
您可以使用反射对第二个对象上的所有属性进行迭代,以请求比较该属性的值。当您不知道要比较的属性名称时,此功能很有用。
希望这会有所帮助