2016-06-13 42 views
3

我有一个列表:最佳性能和解决方案,以删除重复项列表

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价值的同时,实现最佳性能?

+0

这不是链接的问题,这与简单的值,其中“复制”涉及的副本意味着平等。 – Jay

+0

只有“重复问题”不会根据请求保留最后日期。所以不只是。把一个独特的或通过哈希集。不要点击太快重复... –

回答

4

这至少是最可读的方法,并假定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(); 
+1

我需要最好的性能,我可以使用linq,但我不想要它。 –

+0

其实我认为GroupBy()可能非常有效。 –

+0

我有一个约1百万条记录的列表,所以我认为GroupBy不是很好的表演! –

3

我认为蒂姆提出的解决方案是好的。 (第一个)你应该遵循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字典

+2

我甚至不知道有像KISS Algo这样的东西。 +1。 – Bharat