我正在尝试学习F#,迄今为止我非常喜欢它。
我正在尝试以F#的思维方式实现一些C#代码,作为练习和学习的练习。
非常抱歉如果此前已经有人回答过了,但我找不到解决所有问题的答案。
我们有一个销售团队结构,其中有销售主管和普通销售人员。主管可能有也可能没有上级主管。
所有销售数据都来自另一个以CSV格式提供的系统。 在读取记录时,我们不知道该销售人员是否有报告。
我似乎不明白如何在F#的不可变世界中加载树形结构。我相信有一种方法。
我们简化的遗留C#代码定义(翻译成英语)。
所以:
非常抱歉如果此前已经有人回答过了,但我找不到解决所有问题的答案。
我们有一个销售团队结构,其中有销售主管和普通销售人员。主管可能有也可能没有上级主管。
所有销售数据都来自另一个以CSV格式提供的系统。 在读取记录时,我们不知道该销售人员是否有报告。
我似乎不明白如何在F#的不可变世界中加载树形结构。我相信有一种方法。
我们简化的遗留C#代码定义(翻译成英语)。
public class SalesPerson
{
public int Id { get; set; }
public SalesPerson Supervisor { get; set; }
public List<SalesPerson> Reports { get; private set; } = new List<SalesPerson>();
public PersonalSales double { get; set; }
public GroupSales double { get; set; }
}
这是代码的简化版本。然而,问题仍然存在:如何加载树?
我想出了以下的F#类型。
type SalesPerson = {
Id : int
Supervisor : SalesPerson option
Reports : List<SalesPerson> option
PersonalSales : double
GroupSales : double
}
我甚至不确定这是否是定义类型的F#方式。
我的问题如下:
- Supervisor指向另一个SalesPerson,且它是不可变的。如果它被新的SalesPerson替换了(因为不可变数据起作用),则引用将中断。
- Reports是不可变的。我认为我可以使用C#的
List<T>
,但我不确定这是否是F#的方法。 - Supervisor的报告记录不遵循Supervisor记录。它们可能在下面的X行中出现,并且不全部在一起。但是,系统确保Supervisor记录始终会在该主管的任何报告记录之前出现。
- 如何在加载树之后更新GroupSales计算字段。
示例CSV文件如下:
1,,100.00
2,,110.00
3,1,50.00
4,1,75.00
5,2,80.00
6,,92.00
所以:
1 -> 2 reports
2 -> 1 report
3,4,5,6 -> No reports
我非常感谢你能够为这些问题提供任何“帮助”。
谢谢...
GroupSales
?(自己的PersonalSales
+ 孩子们的PersonalSales
)。我想只计算一次,而不是每次我们要求它时都计算。谢谢,David。 - Crazy SpaniardGroupSales
=PersonalSales
+ 子代的GroupSales
,这相当于PersonalSales
+ 后代 的PersonalSales
。 - TheQuickBrownFoxGroupSales
=PersonalSales
+ 孩子们的GroupSales
非常好用。 - Crazy Spaniard