2009-12-08 5 views
1

У меня есть список List<T> instancesСписок Duplicates для конкретного класса

где T имеет переменную даты и идентификатор строки. Теперь мне нужен список, чтобы удалить дубликаты идентификатора строки и сохранить только последние даты. Кто-нибудь знает как?

Я думал о создании нового списка List<T> final и обхода списка экземпляров. В цикле проверяем, содержит ли список элемент с идентификатором, а затем добавляет элемент или удаляет дубликат элемента с более низкой датой.

Однако я не знаю, как проверить наличие на переменной класса T. Должен ли я делать это с помощью выражения лямбда? или перезаписать 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 на идентификаторе строки, затем 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 }; 
}