Склеивание списка в строку в F # - PullRequest
1 голос
/ 25 февраля 2010

Теперь я могу добавить одно значение или пучки в конвейер, мой следующий вопрос: могу ли я добавить список / массив:

filesUnderFolder
|> Seq.map FileInfo  

Моя проблема в том, что я не могу обработать это с помощью pipe |>, или я могу?

Assembly.GetExecutingAssembly.GetFiles()
|>Array.map (fun file -> file.ReadAllText().Contains(keyword))

Ответы [ 2 ]

3 голосов
/ 25 февраля 2010

Я не понимаю, о чем ваш вопрос, но правильная версия:

open System.Reflection
open System.IO

Assembly.GetExecutingAssembly().GetFiles() 
|> Seq.map (fun file -> new StreamReader(file)) 
|> Seq.map (fun file -> file.ReadToEnd().Contains(keyword)) 
|> Seq.iter(printfn "%s")

Сначала вам нужно получить GetExecutingAssembly и вам нужен его результат. Так что (). Второй GetFiles(), возвращает массив Stream, а не FileInfo, как вы могли ожидать. Из-за этого вы должны обернуть Stream до StreamWriter.

Вот так.

2 голосов
/ 25 февраля 2010

Глядя на ваш комментарий, вы пытаетесь это сделать?

Assembly.GetExecutingAssembly().GetFiles() 
|> Seq.map (fun file -> 
    let stream = new StreamReader(file)
    file, stream.ReadToEnd().Contains(keyword))
|> Seq.filter snd
|> Seq.map fst
|> Seq.iter (fun file -> printfn "%s" file.Name)

Императивный стиль может быть чище.

for file in Assembly.GetExecutingAssembly().GetFiles() do
    let stream = new StreamReader(file)
    if stream.ReadToEnd().Contains(keyword) then
        printfn "%s" file.Name
...