2010-12-15 7 views
0

zu erstellen Ich habe Folgendes erstellt, um mein Problem zu erklären.Können Sie helfen, eine Sammlung zu filtern und eine andere in linq

Gegeben eine Liste mit PayDates und Punkten. Ich muss eine neue Liste mit 1 Artikel für jeden Zeitraum erstellen, der dem Zahlungstermin am nächsten ist.

So gegeben das Beispiel der Liste 2 Artikel zurückgeben sollte „1. des Monats“ und „17. des Monats“, da sie die Nähe zu ihren paydate in ihrer Zeit

irgendwelche Vorschläge sind?

private static List<Schedule> GetFilteredScheduleList() 
    { 
    List<Schedule>oldScheduleList=new List<Schedule>(); 
    oldScheduleList.Add(new Schedule { PayDate = new DateTime(2011, 1, 1), Id = 1, Name = "1st of the month", Period = SchedulePeriod.Monthly }); 
    oldScheduleList.Add(new Schedule { PayDate = new DateTime(2011, 1, 4), Id = 1, Name = "4th of the month", Period = SchedulePeriod.Monthly }); 
    oldScheduleList.Add(new Schedule { PayDate = new DateTime(2011, 1, 19), Id = 1, Name = "19th of the month", Period = SchedulePeriod.Monthly }); 
    oldScheduleList.Add(new Schedule { PayDate = new DateTime(2012, 1, 3), Id = 1, Name = "3rd of each quarter", Period = SchedulePeriod.Quarterly }); 
    oldScheduleList.Add(new Schedule { PayDate = new DateTime(2013, 1, 8), Id = 1, Name = "8th each quarter", Period = SchedulePeriod.Quarterly }); 
    oldScheduleList.Add(new Schedule { PayDate = new DateTime(2011, 1, 17), Id = 1, Name = "17th of the month", Period = SchedulePeriod.Quarterly }); 

    // Need to create a new list containing 1 item for each period that is nearest to its Pay Date.Starting point it's today's date. 
    // so the list should return 2 items "1st of the month" and "17th of the month" as they are the closest to their paydate in their period 

    List<Schedule> newScheduleList = oldScheduleList.Where(x=>x.PayDate) 
    } 

Antwort

4

Dies sollte das Schedule Element aus jeder Periode auswählen, die nun am nächsten ist. Hast du das gemeint?

oldScheduleList 
    .GroupBy(s => s.Period) 
    .Select(
     g => g 
       .OrderBy(s => Math.Abs((s.PayDate - DateTime.Now).TotalSeconds)) 
       .First() 
    ) 

Edit:

Als Antwort auf Ihren Kommentar, der erste Punkt für die Zeit zu bekommen, ist ein wenig einfacher. Ich habe eine Where Klausel kommentiert. Dies wird die erste in der Periode von jetzt (dh Daten, die ignoriert abgelaufen sind) erhalten

oldScheduleList 
    .GroupBy(s => s.Period) 
    .Select(
     g => g 
       //.Where(s => s.Paydate >= DateTime.Now) //filter expired dates 
       .OrderBy(s => s.PayDate) 
       .First() 
    ) 
+0

Vielen Dank für Ihre reply.That works.What über nur die Daten innerhalb der gesetzten Frist zu vergleichen und bekommen die first.That ist, was wirklich Ich bin nach.Sorry für nicht erklären, richtig und danke für Ihre Hilfe – user9969

+0

fantastisch alle funktioniert.THANK YOU !!! Wenn du Zeit hast, kannst du erklären, was math.abs in deiner ersten Antwort macht.Auch danke – user9969

+0

Math.Abs ​​gibt den absoluten Wert seines einzelnen Parameters an. Seine Logik ist wie folgt: Für einen Wert x, wenn x <0 return -x sonst Rückgabe x. Daher hat es die Wirkung, das negative Vorzeichen von negativen Zahlen zu trennen. Wir können es verwenden, um die Größe der Differenz zwischen zwei Werten zu erhalten. Zum Beispiel haben 2 und 4 eine Differenz von 2. Wir können dies wie folgt berechnen: Math.Abs ​​(2-4) oder Math.Abs ​​(4-2), in beiden Fällen ist die Antwort 2. – spender

Verwandte Themen