2016-03-27 6 views
0

Ich habe eine C# -Liste eines Modells.Wie kann ich einen Teil einer Liste mit der Erstellungszeit zurückgeben?

List<FooModel> myModel; 

public class FooModel { 
    public int CreationTimeInMs; 
} 

Meine Liste wird bereits von CreationTimeInMs (DSC) sortiert und ich möchte ein Teil dieser Liste erhalten bis zu 30 Tage dauern. Zum Beispiel: Wenn ich 1000 Elemente in der Liste habe und die CreationTimeInMs 2 Monate zurückgeht, würde ich gerne eine Liste von nur den letzten 30 Tagen machen.

Was ist der Ansatz?

+2

zu verarbeiten Irgendein Grund wird dies als eine Zeichenfolge gespeichert? –

+0

@TahTatsumoto, Es wird als Ganzzahl von einer 3rd Party API zurückgegeben – Alon

Antwort

2

30 Tage bedeutet 60 * 1000 * 60 * 24 * 30 = 2.592.000.000ms

verwenden in einem einfachen Ausdruck Lambda die neuesten Modelle auszufiltern. Beachten Sie, dass Sie Ihre "tatsächliche Zeit" kennen müssen.

UInt64 ActualTime = 12345; //Define the actual time in ms here 
IEnumerable <myModel> NewestModels = myModel.Where(x => ActualTime - (Convert.ToUInt64(x.CreationTimeInMs)) > 2592000000); 

Jetzt ist Ihre NewestModels enthält alle Modelle, die Sie benötigen.

+0

Wie berechne ich die Zeit jetzt in Millisekunden? – Alon

+0

Das hängt davon ab, welches Zeitformat Ihr Drittanbieter-Tool verwendet. Haben Sie mehr Informationen zum Zeitformat? – Fruchtzwerg

1

Eine Lösung ist die folgende:

long nowTimestamp = <compute now timestamp>; 
long delta = 30 * 24 * 60 * 60 * 1000;  // ms 
var result = myModel.Where(item => nowTimestamp - item.CreationTimeInMs > delta); 

Doch dieser Ansatz eine lineare Komplexität (O (list_length)) und verwendet nicht die Tatsache, dass es sortiert wird.

Wenn die Liste sortiert ist absteigend können Sie nur eine andere Liste aufzubauen, solange aktuellen Zeitstempel ist neu genug:

var recentList = new List<FooModel>(); 
foreach (var item in myModel) 
{ 
    if (nowTimestamp - item.CreationTimeInMs > delta) 
     break; 

    recentList.Add(item); 
} 

Dies ist der schnellste Ansatz, erfordert aber die Liste in absteigender Weise bestellt werden .

Wenn die Liste in aufsteigender Reihenfolge angezeigt wird, müssen Sie zuerst das Element finden, das als letztes eingefügt werden soll. Wie bereits erwähnt, ist der schnellste Weg ein binärer Suchansatz, wie in this question angegeben.

Verwendung bereitgestellt Index können Sie alle folgenden Elemente erhalten:

int indexOfFirstElement = myModel.BinarySearchForMatch(item => item.CreationTimeInMs > nowTimestamp - delta); 

var recentList = new List<FooModel>(); 
for (int i = indexOfFirstElement; i < myModel.Count; i ++) 
{ 
    recentList.Add(myModel[i]); 
} 

Binary Suche dauert O (log (list_size)) und Liste Konstruktion ist O (result_size).

+0

Es ist jetzt eine Ganzzahl, keine Zeichenfolge – Alon

-1

Hat der Container bereits sortiert worden ist, würde ich einen binären Suchalgorithmus verwenden, um die untere (oder obere) Grenze zu finden, passieren dann den Iterator so dass der Empfänger den Iterator verwenden könnte den benötigten „Teil“

Verwandte Themen