好的,所以,我刚刚开始学习 F#。我在大学等地接触过一些函数式语言,但在使用 F# 等语言进行现实世界编程时,我仍然很陌生。
我每天都在 C# 中工作,但今天我有机会花一些时间研究我公司的代码库,并从 F# 的角度来看待它。我决定尝试用 F# 重写我们的一些 C# 代码,以便在现实的业务环境中感受这种语言。
这是我努力翻译的一些 C# 代码的解释:
// MyData is a class with properties Id, Analysis, and some other relevant properties
// Each pair of (Id, Analysis) is (should be) distinct
IEnumerable<MyData> data = // fetch from DB...
// dataDict[id[analysis]] = MyData object (or "row") from DB
var dataDict = new Dictionary<String, Dictionary<String, MyData>> ();
foreach(var d in data)
{
if(!dataDict.ContainsKey(d.Id))
dataDict.Add(d.Id, new Dictionary<string, MyData>());
if (dataDict[d.Id].ContainsKey(d.Analysis))
{
logger.Warn(String.Format("Id '{0}' has more than one analysis of type '{1}',
rows will be ignored", d.Id, d.Analysis));
}
else
{
dataDict[d.Id].Add(d.Analysis, d);
}
}
我以“功能性”方式重写循环的尝试导致了以下代码,但我对此感觉并不好。
let dataDict =
dict [
for d in data
|> Seq.distinctBy(fun d -> d.Id) -> d.Id,
dict [
for x in data |> Seq.filter(fun a -> a.Id = d.Id) -> x.Analysis, x
]
]
这段代码有几个问题:
- 如果出现重复的 (Id, Analysis) 对,它不会记录警告,甚至更糟
- 我使用 for 和 Seq.filter 遍历数据(至少)两次。
我该如何改进呢?我做错了吗?