作为学习练习,我正在使用 F# 和 F# 的类型提供程序功能对 5000 行 csv 文件进行一些数据分析。当我在 f# 中使用类型提供程序生成的类型时,csv 文件的标题行自然会成为该类型的字段名称。
type restaurantCsv = CsvProvider<"C:\Users\Paul\Desktop\HealthDepartment\RestaurantRatings2013.csv",HasHeaders=true>
type RawInspectionData(filename : string) =
member this.allData = restaurantCsv.Load(filename)
member public this.inspectionsList = this.allData.Data.ToList()
member this.FilterByName(name : string) =
this.allData.Data
|> Seq.filter (fun x -> x.EstablishmentName.Contains(name))
另外,我从单元测试 C# 文件调用 F# 代码(在上述代码创建的库中)。效果很好。但是,当我使用 F# 从 FilterByName 返回的 IEnumberable 时,不会保留字段名称信息。所以我有代码将新字段名称从元组映射到 .Item1、Item2 等:
var inspectionsOnCafes = inspections2013.FilterByName("Cafe");
var inspections = (from row in inspectionsOnCafes
select new
{
inspectorID = row.Item3,
restaurantName = row.Item5,
inspectionDate = row.Rest.Item6
}).ToList();
我的问题有没有办法让 C# 识别 F# 生成类型中的字段名称,这样我就不必将 row.Item# 映射到易于阅读的字段名称?换句话说,有没有办法可以得到这样的代码:
inspectorID = row.InspectorID,
// etc.
注:我看了如何创建可从 C# 使用的 F# 类型提供程序? https://stackoverflow.com/questions/12118866/how-do-i-create-an-f-type-provider-that-can-be-used-from-c但在我看来,Cameron Taggert 的问题和 Tomas Petricek 的答案在类型提供者的方面略有不同。即使他们是准确的,我也不明白,所以我仍然需要更多的帮助。