Найдите дубликаты ключей в списке и верните объект с последней датой

#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;
            }
        }