2009-12-08 94 views
1

我有一個列表List<T> instances特定類別的列表重複

其中T有一個日期變量和一個字符串ID。現在我需要列表刪除字符串ID上的重複項,並只保留最新的日期。任何人都知道嗎?

我正在考慮創建一個新列表List<T> final並循環執行實例列表。在循環中檢查列表是否包含具有ID的項目,然後添加項目或刪除具有較低日期的重複項目。

但是,我不知道如何檢查包含在類T的變量上。 我是否必須使用lambda表達式來執行此操作?或者覆蓋List的Equals()?忘記了如何做到這一點。任何幫助?

或者更好的主意永遠是歡迎的!

非常感謝

回答

4

至於建議由蒂姆·羅賓遜:

var instances = new List<Data>() { 
    new Data() { 
     Name = "Two", 
     Date = new DateTime(1998, 1, 1) 
    }, 
    new Data() { 
     Name = "Two", 
     Date = new DateTime(1997, 1, 1) 
    }, 
    new Data() { 
     Name = "One", 
     Date = new DateTime(1998, 1, 1) 
    }, 
    new Data() { 
     Name = "One", 
     Date = new DateTime(1997, 1, 1) 
    }, 
    new Data() { 
     Name = "Three", 
     Date = new DateTime(1998, 1, 1) 
    }, 
    new Data() { 
     Name = "Three", 
     Date = new DateTime(1997, 1, 1) 
    } 
}; 

var groupedMax = from i in instances 
    group i by i.Name into g 
    select new Data() { 
     Name = g.Key, 
     Date = g.Max(i => i.Date) 
    }; 

public class Data 
{ 
    public string Name { get; set; } 
    public DateTime Date { get; set; } 
} 
+0

我的英雄!謝謝你清理那個 – WtFudgE

3

您可以使用.NET 3.5嗎?這聽起來像是GroupBy上的字符串ID,然後每個分組上Max以獲取最新日期。

+0

你能給我一個例子嗎?因爲我不是很熟悉它 – WtFudgE

+0

請看我的答案爲例。乾杯,羅漢。 – rohancragg

0

聽起來像是你應該

0) create a map that will use the String ID as the key 
1) loop thru the list, 
    2) check if there is something already in the map at the map location for ID 
    3) If there is nothing, add the item 
    4) If there is something there, update the map with the most recent item, and discard the other item. 

如果這是走出一個數據庫,就可以讓數據庫處理它的,而不是做其他的海報說什麼。

+0

不能使用數據庫本身,因爲該列表已經從另一個數據庫中查詢出來。它實際上是很多列表。 – WtFudgE

1

您也可以嘗試

public class MyClass 
{ 
    public DateTime dateTime; 
    public int ID; 
} 
private void button1_Click(object sender, EventArgs e) 
{ 
    List<MyClass> list = new List<MyClass>(); 

    list.Add(new MyClass() { dateTime = new DateTime(2009, 01, 01), ID = 1 }); 
    list.Add(new MyClass() { dateTime = new DateTime(2009, 02, 01), ID = 1 }); 
    list.Add(new MyClass() { dateTime = new DateTime(2009, 02, 01), ID = 2 }); 

    var dd = from d in list 
        group d by d.ID into g 
        let MaxDate = g.Max(u => u.dateTime) 
        select new { g.Key, MaxDate }; 
} 
相關問題