Domanda

Ho una lista List<T> instances

in cui T ha una variabile di data e un ID di stringa. Ora ho bisogno la lista per rimuovere i duplicati sul ID di stringa e mantenere solo le ultime date. Qualcuno sa come fare?

Stavo pensando di creare un nuovo elenco List<T> final e scorrendo l'elenco istanze. Nel controllare il ciclo se l'elenco contiene un elemento con l'ID e poi di aggiungere l'articolo o rimuovere l'elemento duplicato con una data inferiore.

Comunque non so come controllare per un contiene su una variabile di una classe di T. Devo fare questo con l'espressione lambda? o sovrascrivere i Equals () di lista? Ho dimenticato come fare sia in realtà. Qualsiasi aiuto?

O una migliore idea è sempre welcom al naturalmente!

Grazie mille molto molto

È stato utile?

Soluzione

Come suggerito da 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; }
}

Altri suggerimenti

Si può utilizzare .NET 3.5? Questo suona come GroupBy sul id stringa, quindi Max su ciascuna classe per ottenere la data ultima.

Si può anche provare

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

Suona come si dovrebbe

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. 

Se questo sta uscendo da una banca dati, basta lasciare che l'affare database con esso, invece facendo ciò che ha detto l'altro manifesto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top