2016-06-13 16 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