2017-12-31 46 views
-2

eine Sammlung gegeben, die wie folgt aussieht:Wie kann ich eine Sammlung durch kleinere Zeitinkremente filtern?

[ 
{Price:123.45, DateTime:01/01/18 12:01:10} 
{Price:89.23, DateTime:01/01/18 12:01:20} 
{Price:66.13, DateTime:01/01/18 12:01:30} 
{Price:75.00, DateTime:01/01/18 12:02:45} 
] 

Wie kann ich diese Sammlung mit Linq filtern, um nur die erste Datenelement enthalten, die zu Beginn jeder Minute am nächsten existiert? So zum Beispiel, möchte ich die Sammlung oben in die folgende Sammlung verwandeln:

[ 
{Price:123.45, DateTime:01/01/18 12:01:10} 
{Price:75.00, DateTime:01/01/18 12:02:45} 
] 

Auch, wie kann ich eine ähnliche Lösung implementieren, sondern die Sammlung von Filtern des ersten Datenelements am nächsten zum Beginn jedes aufzunehmen Minute, möchte ich das erste Datenelement einschließen, das dem Beginn jedes 5-Minuten-Intervalls am nächsten ist? Zum Beispiel, das nächste Datenelement zu 12:00, 12:05, 12:10 usw.?

+0

Was haben du versuchtest? SO ist kein kostenloser Code-Schreibdienst. – itsme86

+2

Mein LINQ-Wissen ist begrenzt. Aber wenn ich das mit SQL machen wollte, würde ich etwas tun wie: Machen Sie eine temporäre Tabelle/Ansicht/wählen Ergebnis bestand aus: Preis, TimeRounded auf die zweite, genaue Zeit. Dann würde nach TimeRounded gruppieren und das erste Mal/Preiseingabe bekommen. – Christopher

+0

Bedeutet der nächste vor oder nach oder kurz nach der Zielzeit? – Plutonix

Antwort

1

Die einfachste Lösung für Ihre erste Frage lautet:

items.GroupBy(x => x.DateTime.AddSeconds(-x.DateTime.Second)) 
    .Select(x => x.OrderBy(i => i.DateTime).First()); 

Dann habe ich versucht, wieder verwendbare Lösung zu machen, die Sie jederzeit Intervall einstellen lässt:

public static IEnumerable<Item> ClosestTo(IEnumerable<Item> items, TimeSpan interval) 
{ 
    return items.GroupBy(item => 
    { 
     // Find a date that is closest to the start of interval. 
     var ticksFloor = item.DateTime.Ticks - (item.DateTime.Ticks % interval.Ticks); 
     return new DateTime(ticksFloor); 
    }).Select(grouping => grouping.OrderBy(item => item.DateTime).First()); 
} 

Beispiel:

var items = new List<Item> 
{ 
    new Item { DateTime = DateTime.Parse("01/01/18 12:01:10") }, 
    new Item { DateTime = DateTime.Parse("01/01/18 12:01:20") }, 
    new Item { DateTime = DateTime.Parse("01/01/18 12:01:30") }, 
    new Item { DateTime = DateTime.Parse("01/01/18 12:02:45") }, 
    new Item { DateTime = DateTime.Parse("01/01/18 12:05:00") }, 
    new Item { DateTime = DateTime.Parse("01/01/18 12:07:30") }, 
    new Item { DateTime = DateTime.Parse("01/01/18 12:09:00") }, 
    new Item { DateTime = DateTime.Parse("01/01/18 12:14:00") } 
}; 

foreach (var item in ClosestTo(items, TimeSpan.FromMinutes(5))) 
{ 
    Console.WriteLine($"DateTime: {item.DateTime}"); 
} 

Der Ausg ut ist:

Datetime: 01.01.2018 12:01:10
Datetime: 01.01.2018 12:05:00
Datetime: 01.01.2018 12:14:00

Verwandte Themen