2009-12-08 10 views
1

J'ai une liste List<T> instancesList Duplicates sur la classe spécifique

où T a une variable de date et un ID de chaîne. Maintenant, j'ai besoin de la liste pour supprimer les doublons sur l'ID de chaîne et ne conserver que les dernières dates. Quelqu'un sait comment?

Je pensais créer une nouvelle liste List<T> final et boucler dans la liste des instances. Dans la boucle, vérifiez si la liste contient un élément avec l'ID, puis ajoutez l'élément ou supprimez l'élément en double avec une date inférieure.

Cependant je ne sais pas comment vérifier un contenu sur une variable d'une classe T. Dois-je faire cela avec l'expression lambda? ou remplacer les égales() de la liste? J'ai oublié comment faire soit réellement. De l'aide?

Ou une meilleure idée est toujours bienvenue à bien sûr!

Merci beaucoup beaucoup

Répondre

4

Comme suggéré par Tim Robinson:

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

mon héros! merci pour effacer cela – WtFudgE

3

Pouvez-vous utiliser .NET 3.5? Cela ressemble à GroupBy sur l'ID de chaîne, puis Max sur chaque regroupement pour obtenir la dernière date.

+0

Pouvez-vous me donner un exemple? Parce que je ne suis pas très familier avec cela – WtFudgE

+0

S'il vous plaît voir ma réponse pour un exemple. À la vôtre, Rohan. – rohancragg

0

On dirait que vous devriez

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. 

Si cela sort d'une base de données, laissez l'accord de base de données avec elle au lieu de faire ce que dit l'autre affiche.

+0

Impossible d'utiliser la base de données elle-même, car cette liste est déjà extraite d'une autre base de données. C'est en fait beaucoup de listes. – WtFudgE

1

Vous pouvez également essayer

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 }; 
}