【问题标题】:Find duplicate keys in list and return the object with the latest date在列表中查找重复键并返回具有最新日期的对象
【发布时间】:2020-12-19 15:23:03
【问题描述】:

我正在尝试查询 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"
}

【问题讨论】:

  • var duplicateKeys = list.GroupBy(x => x["id_lokalid"]) .Where(group => group.Count() > 1) .OrderByDescending(x => x["registrationFrom" ]) .Select(x => x.First()) .ToList();

标签: c# json list linq json.net


【解决方案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;
            }
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 2020-03-04
    • 2017-11-24
    • 1970-01-01
    • 2019-06-29
    • 2021-04-30
    • 2021-11-16
    相关资源
    最近更新 更多