2016-04-21 10 views
0

Ich versuche, eine Teilmenge der Datensätze aus einem Array basierend auf Datum zurückgeben.Iterieren über ein Array mit Array.FindAll()

Mein Code sieht wie folgt aus:

var SomeAccounts = Array.FindAll(Accounts, x => x.modification_date > modification_date); 

if (SomeAccounts == null) 
{ 
    return NotFound(); 
} 

return Ok(JsonConvert.SerializeObject(SomeAccounts)); 

Die Konten Array hat eine modification_date Feld aber was kommt zurück ist alle Konten. In meinem Testprobe haben 2 mod Daten> 15. Mai 2016. Diese Art von Code funktioniert für andere Felder, aber nicht für das Datum, die gerade ist:

public DateTime modification_date { get; set; } 

Was mache ich falsch?

+0

Beginnen Sie mit Iteration, um zu sehen, ob es bei Serialize irgendwie bricht. Zerlegen Sie es, um herauszufinden, woher der Fehler stammt. – Paparazzi

+3

Stellen Sie sicher, dass Ihre 'DateTime'-Werte in der gleichen Zeitzone liegen und vom selben' .Kind' sind. Der Datumsvergleich ist nicht so einfach wie auf der Oberfläche. –

+0

Das zurückgegebene Array ist nie null, es ist dann ein leeres Array. [Dokumentation] (https://msdn.microsoft.com/en-us/library/1kkxfxdd (v = vs.110) .aspx): _ "Ein Array, das alle Elemente enthält, die den Bedingungen entsprechen, die durch das angegebene Prädikat definiert sind, falls gefunden, andernfalls ein leeres Array. "_ –

Antwort

1

sicherzustellen, dass Ihr Array

Erstens tatsächlich leer ist, die Array.FindAll() Methode soll eigentlich nie null zurück, wie es wird ein leeres Array zurück, wenn keine Übereinstimmungen gefunden werden, so dass Sie wahrscheinlich überprüfen, um zu sehen werden wollen wenn alle Werte wurden gefunden:

if (SomeAccounts.Length == 0) 
{ 
    return NotFound(); 
} 

wenn Ihre Ergebnisse zurückgegeben werden waren ein Array (ohne Werte), dann wäre dies korrekt sein (wie es nicht NotFound() getroffen hätte vorher, wie es nie null war).

Prüfungstermine

Wie Cory in einem Kommentar erwähnt, Datetime-Objekte vergleichen kann notorisch schwierig sein. Sie werden sicherstellen wollen, dass alle Informationen wie TimeZones beim Vergleichen der Werte berücksichtigt werden.

Sie könnten auch den Debugger verwenden, um manuell zu überprüfen, wie Ihre DateTime Objekte im Code aussehen (sowohl die modification_date-Eigenschaft als auch Ihre tatsächliche modification_date-Variable). Versuchen Sie, sie im Überwachungsfenster zu vergleichen, um sicherzustellen, dass die Vergleiche ordnungsgemäß funktionieren.

+0

True. Aber beantwortet nicht wirklich die Frage –

+0

Zwei der Änderungsdaten sind modification_date ":" 2015-05-13T15: 15: 19 "Ich vergleiche sie mit 5-12-2015, die als 5-12-2015 12 kommt: 00:00 AM. Im Debugger kann ich nicht weiter in FindAll() gehen. Ich kann nicht sehen, warum der Vergleich immer erfolgreich ist. – Ron

+0

Eine Möglichkeit, die einzelnen Vergleiche zu beheben, wäre das Erstellen eines Dictionary, das jedes Konto seinem Vergleichswert zuordnet wie gesehen [in diesem GitHub Gist] (https://gist.github.com/Rionmonster/2556850471d9c6a953d49cffd52ddbcd). Wenn beide Ihrer Vergleichselemente 'DateTime'-Objekte sind, dann sollte die Formatierung kein Problem sein, aber dies sollte Ihnen erlauben jeden einzeln zu überprüfen –

Verwandte Themen