【问题标题】:Best performance and solution to remove duplicate item in a list删除列表中重复项的最佳性能和解决方案
【发布时间】:2016-06-14 01:27:33
【问题描述】:

我有一个清单:

List<Test> = new List<Test>{
new Test{Name="Test", Date="2016-06-13 18:32:01.380"},
new Test{Name="Test2", Date="2016-06-13 18:32:29.117"},
new Test{Name="Test3", Date="2016-06-13 18:32:40.930"},
new Test{Name="Test3", Date="2016-06-13 18:32:51.517"},
new Test{Name="Test", Date="2016-06-13 18:33:06.477"},
.....
}

如何删除具有重复 Name 值的项目,只保留具有最新 Date 值的项目,同时实现最佳性能?

【问题讨论】:

  • 这不是链接问题的重复,它处理“重复”表示相等的简单值。
  • 只有duplicate question 不保留请求的最后一个日期。所以不只是。放置一个不同的或通过一个哈希集。不要在重复项上点击太快...

标签: c# list


【解决方案1】:

这至少是最易读的方法,并假定Date 实际上是DateTime

tests = tests.GroupBy(t => t.Name)
    .Select(g => g.OrderByDescending(t => t.Date).First())
    .ToList();

这样更有效率:

var latestTests = new Dictionary<string, Test>(tests.Count);
foreach (Test t in tests)
{
    Test test;
    if (latestTests.TryGetValue(t.Name, out test))
    {
        if(test.Date < t.Date)
            latestTests[t.Name] = t;
    }
    else
    {
        latestTests.Add(t.Name, t);
    }
}
tests = latestTests.Values.ToList();

【讨论】:

  • 其实我觉得 GroupBy() 可以很高效。
  • 我有一个大约 100 万条记录的列表,所以我认为 GroupBy 的性能不好!?
  • @TrườngSơn GroupBy() 使用字典(或类似的),所以不会太糟糕。应该是 O(N)
  • @TrườngSơn:总的来说它的性能还可以,因为它也在使用一个集合,它需要更多的内存。但订购也需要一些时间。所以一般来说字典方法会更快。如果你可以使用字典,也许你甚至不需要最后的ToList。您需要按索引还是按名称访问?如果你只想列举最新的测试,你也可以通过foreach(Test t in latestTests.Values)...
【解决方案2】:

我认为 Tim 建议的解决方案很好。 (第一个)你应该遵循KISS原则。

但是……

您可以为它创建一个“字典”并查找每个项目。 我认为这将是最有效的。 这个只做一次查找。

foreach(var searchItem in myList)
{
    Test item;
    if(myDict.TryGetValue(searchItem.Name, out item))
    {
        if(searchItem.Date > item.Date)
        {
            // swap the dates to keep the original objects intact (but this will change the order in the list.)
            var temp = item.Date;
            item.Date = searchItem.Date;
            searchItem.Date = temp;
        }
    }
    else
        // create a copy, you don't want to change the original
        myDict.Add(
            searchItem.Name, 
            searchItem);
}

您可以比较这些结果... groupby vs dictionary

【讨论】:

  • 我什至不知道有类似 KISS Algo 的东西。为此 +1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-16
  • 2022-11-19
  • 2013-11-22
  • 1970-01-01
  • 2017-09-13
  • 2018-03-13
相关资源
最近更新 更多