F#伤害了我的大脑......任何人都可以帮助将C#翻译成F#吗?

时间:2011-10-26 19:10:55

标签: c# f# c#-to-f#

我找到了一个我认为非常适合学习F#的快速项目。然而,由于某种原因,我无法将我的大脑包裹起来。经过几个小时的教程,甚至一些电影,我仍然只是......不明白。

所以我想使用Enterprise Manager“Generate Scripts”开始在工作中对我们的存储过程进行版本控制,并希望删除脚本日期。我放弃了,并在C#中做到了,但现在我真的很好奇,希望有一些见解。

我不是空手而归,这是我的C#代码:

string path = @"C:\Subversion\CompanyName\SQL\DBName";
string fileSpec = "*.sql";
string pattern = @"Script Date: \d{2}/\d{2}/\d{4} \d{2}:\d{2}:\d{2}";
string replace = "Script Date: ";

foreach (var file in Directory.EnumerateFiles(path, fileSpec))
{
    string content = File.ReadAllText(file);

    content = Regex.Replace(content, pattern, replace);

    File.WriteAllText(file, content, Encoding.Unicode);
}

我猜在F#中有一些看起来很酷的2-3线解决方案......我很乐意看到它。

提示!我更新了它以匹配下面的内容,使视觉比较更具启发性。下面也有很好的评论。

3 个答案:

答案 0 :(得分:11)

let path = @"C:\Subversion\CompanyName\SQL\DBName"
let fileSpec = "*.sql"
let pattern = @"Script Date: \d{2}/\d{2}/\d{4} \d{2}:\d{2}:\d{2}"
let replace = "Script Date: "

Directory.EnumerateFiles (path, fileSpec)
|> Seq.iter (fun file ->
    let content = Regex.Replace (File.ReadAllText file, pattern, replace)
    File.WriteAllText (file, content, Encoding.Unicode))

请注意,您的C#代码 编辑:是)也比必要的更详细。

答案 1 :(得分:6)

您需要做的就是在变量声明中替换类型名称(您可以在C#中使用var关键字编写let,删除所有分号和花括号并替换{{ 1}}与
foreach。您还使用了一些名称空间,因此在F#中,您需要以下内容:

for file in files do

你正在使用一个可变变量(open System.IO open System.Text.RegularExpressions ),但你真的不需要改变它。您可以使用其他变量(例如content)来存储替换结果。所以,中间部分将是:

newContent

您也可以使用相同的变量名称,这意味着您声明了一个新的(不可变的)变量,该变量隐藏了范围其余部分中的前一个变量(请参阅此SO answer for more information

即使发生异常,我也会更改最后一位(即使在C#中!)以关闭流。在C#中,您将使用let content = File.ReadAllText(file) // No need for a stream reader here! let pattern = @"Script Date: \d{2}/\d{2}/\d{4} \d{2}:\d{2}:\d{2}" let replace = "Script Date: " let newContent = Regex.Replace(content, pattern, replace) 。要在F#中编写相同的内容,您可以使用using关键字:

use

use fileStream = new FileStream(file, FileMode.Truncate, FileAccess.Write, FileShare.None) use writer = new StreamWriter(fileStream, Encoding.Unicode) writer.Write(content) writer.Flush() 关键字确保对象在超出范围时处理(关闭) - 即,在use循环迭代结束时(在这种情况下)。

答案 2 :(得分:1)

微不足道的。编译。在Reflector中打开。选择反编译语言为F#。