f#伤了我的大脑…有人能帮忙把c#翻译成f#吗?

本文关键字:翻译 我的 | 更新日期: 2023-09-27 18:12:34

我发现了一个我认为非常适合学习f#的快速项目。然而,出于某种原因,我就是无法理解它。看了几个小时的教程,甚至看了一些电影之后,我仍然只是……别明白。

所以我想开始使用企业管理器"生成脚本"对工作中的存储过程进行版本控制,并想要清空脚本日期。我放弃了,用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行解决方案…我很想去看看。

谢谢你的提示!我已经更新了它,以匹配下面正在做的事情,使视觉比较可能更有启发性。

f#伤了我的大脑…有人能帮忙把c#翻译成f#吗?

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#代码 (EDIT: was)也比必要的要冗长得多。

几乎所有你需要做的就是用let关键字替换变量声明中的类型名(你可以在c#中写var),去掉所有分号和花括号,用
替换foreachfor file in files do。您还使用了一些名称空间,因此在f#中,您需要这样的内容:

open System.IO
open System.Text.RegularExpressions

你正在使用一个可变变量(content),但你并不真的需要改变它。您可以使用一个不同的变量(如newContent)来存储替换的结果。因此,中间部分将是:

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)

您也可以使用相同的变量名,这意味着您正在声明一个新的(不可变的)变量,该变量将前一个变量隐藏在作用域的其余部分(有关更多信息,请参阅此SO回答)

我也会改变最后一位(即使在c#中!),即使发生异常也会关闭流。在c#中,您将使用using。要在f#中编写相同的内容,您可以使用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关键字确保对象在超出作用域时(即在for循环迭代结束时)被处置(关闭)。

不重要。编译。打开反射器。选择反编译语言为f#。