2009-08-18 8 views
2

Ich bekomme die followwing direcories von GetDirectories()Linq zu filtern Verzeichnisse

c Aufruf: \ app \ 20090331 \ c: \ app \ 20090430 \ c: \ app \ 20090531 \ c: \ app \ 20090630 \ c: \ app \ 20090731 \ c: \ app \ 20090831 \

ich auf die Verzeichnisse wollen zwischen 20090531 und 20090731, Wie kann ich es von Linq zu tun? Danke!

Antwort

1

Verwenden Sie eine LINQ .Where Anweisung und String.Compare zwischen Min- und Max-Verzeichnisnamen (als Strings) mit x (als String).

Stören Sie nicht blah .Parse, nur String-Vergleiche - Ihre Verzeichnisnamen sind sowieso numerisch, so dass es nicht sinnvoll ist zu analysieren, wenn Sie nur einen geraden Wert Vergleich sowieso verwenden können.

var query = directories 
    .Where(x => { 
     return (String.Compare(x, @"c:\app\20090531") > 0 && String.Compare(x, @"c:\app\20090731") < 0) 
    }); 
+0

Ihre Anfrage funktioniert nicht, das Lambda gibt nichts zurück, Sie entkommen nicht '\', und Ihre erste Zeichenfolge ist nicht gleich formatiert. Aber der Vergleich sollte funktionieren –

+0

Whoops danke. Bearbeitet für Schlamperei. – jscharf

3

.Where (x => x> "c: \ app \ 20090531" & & x < "c: \ app \ 20090731") ToList()

Der ToList ist, wenn Sie es in einem mögen. Liste. Lassen Sie das, wenn Sie mit IEnumerable in Ordnung sind.

+0

Es gibt elegantere Möglichkeiten (das Datum aussortieren, etc.), aber das sollte es tun. –

0

Ich habe: Operator ‚>‘ kann nicht auf Operanden Typ ‚string‘ angewendet werden, und ‚string‘

+0

Sie sollten dort Ihre eigene Logik einfügen. Schreiben Sie eine Methode, die eine Zeichenfolge annimmt und eine Bool-Angabe zurückgibt, ob der Pfad gültig ist, und rufen Sie diese in Ihrem Lambda auf. –

+0

Ah, auch richtig. Das tut mir leid. Ich habe mich mehr auf das Lambda als auf den String-Vergleich konzentriert. –

0
var query = directories 
    .Where(d => { 
     int directoryNumber = int.Parse(d.Replace(@"c:\app\", string.Empty) 
      .Replace("\\", string.Empty)); 
     return directoryNumber > 20090531 && directoryNumber < 20090731; 
    }); 

Sie können es auch konvertieren Datetime, wenn nötig.

Edit: anscheinend Stackoverflow, oder was auch immer Parsing verwendet, mag nicht meine wörtlichen Strings.

Verwandte Themen