2010-04-07 75 views
2

我與解決方案來移除泛型列表<牛逼>重複在.NET 2.0如下:從泛型列表刪除重複<T>

List<CaseStudy> caseStudies = CaseStudyDAO.FindCaseStudiesByDate(DateTime.Now.Date, DateTime.Now.Date.AddDays(1)); 
caseStudies.RemoveAll(
     delegate(CaseStudy c) 
     { 
      return caseStudies.IndexOf(c) != caseStudies.FindIndex(
       delegate(CaseStudy f) { return c.Str == f.Str; }); 
     }); 

我的問題是:

有沒有更有效的方法去做這個?只有.NET 2.0解決方案
上述解決方案的複雜性是什麼?

謝謝,
jan2k10

+0

重複:http://stackoverflow.com/questions/344519/select-distinct-from-a-list-of-ienumerablet-in- net-2-0 – 2010-04-07 17:52:47

+0

這個問題是關於具體解決方案 – 2010-04-07 18:02:32

+0

sry,這個問題的答案包含複雜性和最有效的方式 - 幾乎所有你要求的東西......你應該重申你的問題只是要求複雜性您的解決方案 – 2010-04-07 18:05:14

回答

12

removeall過的時間複雜度是O(n)。索引的時間複雜度是O(n),所以這是O(n^2)時間複雜度的總和。空間複雜性,我認爲,O(1)。

有沒有更有效的方法來做到這一點?是。如果你願意花費更多的空間,你可以在O(n)的時間複雜度上做到這一點。

+0

Plus解釋複雜性 – 2010-04-07 17:50:58

+0

是的,RemoveAll的空間複雜度爲O(1)。正如Eric所建議的那樣,如果你願意使用更多的空間,你可以在列表中建立一個「Dictionary 」項目(使用該項目作爲鍵和值或類似的東西)。或者尋找人們已經建立的預先存在的「Set 」實施方案。 – 2010-04-07 18:01:05

5

如果你樂意使用更多的空間只是對Eric的約O(n)的評論時展開,我會做這樣的事情:

Dictionary<string, CaseStudy> lookup = new Dictionary<string, CaseStudy>(); 
foreach (CaseStudy cs in caseStudies) 
{ 
    lookup[cs.Str] = cs; 
} 
caseStudies = new List<CaseStudy>(lookup.Values); 

有兩點要注意:

  • 這將caseStudies的值更改爲引用新列表。如果你希望它是同List<T>內,你可以使用:

    caseStudies.Clear(); 
    caseStudies.AddRange(lookup.Values); 
    
  • 這使得在列表中的最後一個元素與每個不同Str值。這只是爲了儘可能縮短。如果你想第一元素,使用:

    foreach (CaseStudy cs in caseStudies) 
    { 
        if (!lookup.ContainsKey(cs.Str)) 
        { 
         lookup[cs.Str] = cs; 
        } 
    } 
    
+0

您的解決方案對我來說最合適。謝謝 – 2010-04-07 18:41:10