2016-12-25 5 views
0

Ich habe eine dynamische Objektliste in folgendem FormatBestellen seltsame Daten Linq

period  key  value 
"2013-3"  mykey1 5 
"2013-4"  mykey1 6 
. 
. 
. 
"2013-10" mykey1 15 
"2013-11" mykey1 25 
"2013-12" mykey1 6 

, was ich will, ist, die Werte zu erhalten, wo Schlüssel == „mykey1“ von Zeit bestellt.

I wie unten versucht ..

data.Where(w => w.key == "mykey1").OrderBy(i => i.period).Select(s => s.value).ToArray(); 

Was passiert ist, als Zeit-String ist, können Sie Daten 2013-10 bis 2013-12 vor 2013-3 erhalten.

+0

verwenden würde ich Ihre Zeit zu speichern, wie 'DateTime' vorschlagen. Sie haben also keinen Overhead für die Analyse in jeder Abfrage. –

+0

die Daten kommen von Drittpartei, also keine Kontrolle dort ... – Arnab

Antwort

3

können Sie

data.Where(w => w.key == "mykey1").OrderBy(i => DateTime.ParseExact(i.period, "yyyy-M", 
             System.Globalization.CultureInfo.InvariantCulture)).Select(s => s.value).ToArray(); 
+0

Die beste überladene Methodenübereinstimmung für 'System.DateTime.ParseExact (String, String, System.IFormatProvider)' hat einige ungültige Argumente – Arnab

+0

versuchte sogar "yyyy-M" – Arnab

+0

Ich fand die Änderung von yyyy-MM zu yyyy-M und versuchte aber immer noch gleichen Fehler .. – Arnab

1

Dies ist, weil es string Werte nicht Date Werte Sortierung ist.

Sie können versuchen, die Werte zu Daten in der OrderBy Klausel zu analysieren.

Etwas wie:

data.Where(w => w.key == "mykey1") 
    .OrderBy(i => DateTime.Parse(i.period)).Select(s => s.value).ToArray(); 
+0

es wirft einen Fehler Die beste überladene Methodenübereinstimmung für 'System.DateTime.Parse (Zeichenkette)' hat einige ungültige Argumente möglicherweise, weil Periode in meinem Fall nicht hat ein Tag Wert .. Die Parse-Methode nimmt auch einen zweiten Parameter FormatProvider und dritten DateTimeStyles. Wird Hinzufügen von Hilfe? – Arnab

+1

Ja @Arnab Ich erklärte nur die Probe, die TryParse-Methode oder Vorabprüfung wird den Trick für Sie tun. Entschuldigen Sie die Unannehmlichkeiten. –

0

Sie Pad kann mit Nullen. Etwas wie folgt aus:

data.Where(w => w.key == "mykey1").OrderBy(i => i.period.PadLeft(i.period.Max(x => x), '0')) 
    .Select(s => s.value).ToArray(); 

Das Ergebnis der Unterlage wird:

"02013-3", 
"02013-4", 
"2013-10", 
"2013-11", 
"2013-12" 

Und so wird es Aufträge diese Liste wie erwartet. wenn möglich

Verwandte Themen