2012-04-11 4 views

Antwort

7
open System.IO 
let driveLetters = set [ for d in DriveInfo.GetDrives() -> d.Name.[0] ] 
let unused = set ['A'..'Z'] - driveLetters 
+0

also können Sie Sets subtrahieren, aber keine Sequenzen? Was ist am nächsten zu einem Set in C#? – Maslow

+3

@Maslow: 'System.Collections.Generic.HashSet <>' und LINQ hat viele set-like-Operationen. – ildjarn

+1

In C# könnten Sie tun: 'var unbenutzt = new HashSet (allLetters); unused.ExceptWith (driveLetters); ' – Daniel

3

Ihr erster Fehler ist das Mischen zwischen char und string, ist es gut, mit char zu starten:

let all = {'A'..'Z'} 
let validDrives = GetDrives |> Seq.map (fun x -> x.Name.[0]) 

Jetzt ungültige Laufwerksbuchstaben sind die Buchstaben, die in all sind aber nicht in validDrives:

let invalidDrives = 
     all |> Seq.filter (fun c -> validDrives |> List.forall ((<>) c)) 

Seit validDrives wird mehrmals durchlaufen, um auf Mem zu überprüfen In diesem Beispiel ist es besser, es in ein Set umzuwandeln:

let all = {'A'..'Z'} 
let validDrives = GetDrives |> Seq.map (fun x -> x.Name.[0]) |> Set.ofSeq 
let invalidDrives = all |> Seq.filter (not << validDrives.Contains)