Ich folgte F#: Filter items found in one list from another list aber konnte es nicht auf mein Problem anwenden, da beide Lösungen, die ich sehe, scheinen nicht zu kompilieren. List.Contains existiert nicht (eine Referenz fehlt?) Und ListA - ListB kompiliert auch nicht.Holen Sie sich eine Liste der ungültigen Laufwerksbuchstaben
1
A
Antwort
7
open System.IO
let driveLetters = set [ for d in DriveInfo.GetDrives() -> d.Name.[0] ]
let unused = set ['A'..'Z'] - driveLetters
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)
also können Sie Sets subtrahieren, aber keine Sequenzen? Was ist am nächsten zu einem Set in C#? – Maslow
@Maslow: 'System.Collections.Generic.HashSet <>' und LINQ hat viele set-like-Operationen. – ildjarn
In C# könnten Sie tun: 'var unbenutzt = new HashSet (allLetters); unused.ExceptWith (driveLetters); ' –
Daniel