#c# #json #list #linq #json.net
#c# #json #Список #linq #json.net
Вопрос:
Я пытаюсь запросить список объектов Json, и мне нужно найти дубликаты ключей и вернуть объект с последней датой для каждого ключа. До сих пор мне удавалось возвращать объект, но если это всего лишь один ключ.Это то, что я получил к настоящему времени:
List<JObject> list = new List<JObject>();
List<JObject> duplist = new List<JObject>();
JObject rss = new JObject(new JProperty("id_lokalid", "12312"),
new JProperty("unitdescription", "registrationFrom"),
new JProperty("registrationFrom", "2019-01-21T11:56:37.753899 01:00"));
JObject rss1 = new JObject(new JProperty("id_lokalid", "123"),
new JProperty("unitdescription", "registrationFrom"),
new JProperty("registrationFrom", "2019-02-21T11:56:37.753899 01:00"));
JObject rss2 = new JObject(new JProperty("id_lokalid", "123"),
new JProperty("unitdescription", "regs"),
new JProperty("registrationFrom", "2019-02-22T11:56:37.753899 01:00"));
JObject rss3 = new JObject(new JProperty("id_lokalid", "12312"),
new JProperty("unitdescription", "regs"),
new JProperty("registrationFrom", "2019-03-22T11:56:37.753899 01:00"));
list.Add(rss);
list.Add(rss1);
list.Add(rss2);
list.Add(rss3);
var duplicateKeys = list.GroupBy(x => x["id_lokalid"])
.Where(group => group.Count() > 1)
.Select(group => group.Key).ToList();
Console.WriteLine(duplicateKeys.Count());
foreach (var obj in list)
{
if (duplicateKeys.Contains(obj["id_lokalid"]))
{
duplist.Add(obj);
}
}
foreach (var d in duplicateKeys)
{
foreach (var ob in duplist)
{
if (ob["id_lokalid"] == d)
{
var latestobj = ob;
Console.WriteLine("This is the latest object" latestobj.ToString());
var registrationFrom = DateTime.Parse((string)latestobj["registrationFrom"], null, System.Globalization.DateTimeStyles.RoundtripKind);
var NextOfIs = duplist.SkipWhile(x => x != latestobj).Skip(1).DefaultIfEmpty(duplist[0]).FirstOrDefault();
Console.WriteLine("This is the next object" NextOfIs);
var date = DateTime.Parse((string)NextOfIs["registrationFrom"], null, System.Globalization.DateTimeStyles.RoundtripKind);
if (date > registrationFrom)
{
latestobj = NextOfIs;
}
}
}
Console.WriteLine(latestobj.ToString());
И это то, что он возвращает
{
"id_lokalid": "123",
"unitdescription": "regs",
"registrationFrom": "2019-02-22T11:56:37.753899 01:00"
}
Комментарии:
1. var duplicateKeys = список. GroupBy(x => x[«id_lokalid»]) .Где(group => группа. Count() > 1) .OrderByDescending(x => x[«registrationFrom»]) .Выберите(x => x.First()) .ToList();
Ответ №1:
Вы можете переписать свою логику с O (n) временной сложностью, введя дополнительное пространство. Приведенный ниже код обеспечивает лучшую производительность по мере увеличения размера вашего ввода
List<JObject> list = new List<JObject>();
List<JObject> duplist = new List<JObject>();
JObject rss = new JObject(new JProperty("id_lokalid", "12312"),
new JProperty("unitdescription", "registrationFrom"),
new JProperty("registrationFrom", "2019-01-21T11:56:37.753899 01:00"));
JObject rss1 = new JObject(new JProperty("id_lokalid", "123"),
new JProperty("unitdescription", "registrationFrom"),
new JProperty("registrationFrom", "2019-02-21T11:56:37.753899 01:00"));
JObject rss2 = new JObject(new JProperty("id_lokalid", "123"),
new JProperty("unitdescription", "regs"),
new JProperty("registrationFrom", "2019-02-22T11:56:37.753899 01:00"));
JObject rss3 = new JObject(new JProperty("id_lokalid", "12312"),
new JProperty("unitdescription", "regs"),
new JProperty("registrationFrom", "2019-01-21T11:56:37.753899 01:00"));
list.Add(rss);
list.Add(rss1);
list.Add(rss2);
list.Add(rss3);
var dictionary = new Dictionary<string, JObject>();
foreach (var item in list)
{
JObject jobject;
if (dictionary.TryGetValue(item["id_lokalid"].ToString(), out jobject))
{
if (DateTime.Parse(jobject["registrationFrom"].ToString()) < DateTime.Parse(item["registrationFrom"].ToString()))
{
dictionary[item["id_lokalid"].ToString()] = item;
}
}
else
{
dictionary[item["id_lokalid"].ToString()] = item;
}
}