2010-02-25 24 views
1

現在我可以單value or tubles添加到管道,我的下一個問題是,我可以添加一個列表/數組:管道中的列表入F#線

filesUnderFolder 
|> Seq.map FileInfo 

我的問題是我不能處理此管道|>,或者我可以嗎?

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

回答

2

看着你的評論你想要做到這一點?

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 
3

我不明白,你怎樣的問題,但正確的版本是:

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

就是這樣。

+0

是的,那種。 但是,隨着您編寫的代碼,我無法打印第二行的文件名/訪問文件值。任何想法? – demokritos 2010-02-25 09:58:01

+0

和「你的第二個」評論與我之前提到的問題的主題有關聯......對於混淆...抱歉... – demokritos 2010-02-25 10:00:36

+0

流中沒有文件名。所以你無論如何都不能推測它。 'ReadToEnd()'讀取整個流。所以它會一行一行地打印整個文件。如果你需要打印線,只需使用ReadLine()。讓我知道你是否需要例子。 – 2010-02-25 22:48:31