Сначала вы можете создать два класса моделей, представляющих ваш 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; }
}
Затем десериализовать JSON с этими классами, используя Newtonsoft Json. NET. Поскольку мы имеем дело с 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);
Затем вы можете просто сравнить, используя Any()
из LINQ:
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}");
}
}
Какие выходы:
Match found with 001 and Name_2
No match found with 002 and Name_3
Другая реализация можно десериализовать в кортежи, а затем просто преобразовать twos в HashSet<T>
и использовать его для поиска. Наличие хэш-набора улучшает поиск от O (N) до O (1) и может обеспечить увеличение производительности для больших наборов данных. HashSet<T>.Contains(T)
- метод O (1).
var ones = JsonConvert
.DeserializeObject<List<One>>(json1)
.Select(x => (x.IdInOne, x.NameInOne));
var lookups = JsonConvert
.DeserializeObject<List<Two>>(json2)
.Select(x => (x.IdInTwo, x.NameInTwo))
.ToHashSet();
foreach (var (IdInOne, NameInOne) in ones)
{
if (lookups.Contains((IdInOne, NameInOne)))
{
Console.WriteLine($"Match found with {IdInOne} and {NameInOne}");
} else
{
Console.WriteLine($"No match found with {IdInOne} and {NameInOne}");
}
}