如果我有这样的类型:
type Cats =
{ Breed = string
Color = string
Alive = bool }
我将数据映射到它:
let mapdata =
Catfile.GetSample().Rows
|> Seq.map (fun row ->
{ Breed = row.breed
Color = row.color
Alive = row.status }
如何从该记录中调出“品种”或“颜色”? 我的想法是,它会是这样的:
Cats.Breed or Cats.Color
这是真的吗?
当我在记录中调用字段时,我的意思是调用映射到该字段的所有数据的序列。
编辑:
我希望能够根据上面的结果过滤来自其他csv的数据,而不必再次运行“mapdata”的整个功能。
所以我希望能够通过执行以下操作来隔离“Breed”的结果:Cats.Breed
来调用该字段中的所有值,并根据它是否在Cats.Breed
中过滤不同的数据。
类似的功能:
let similarvalues = Seq.Contains (OtherData) Cats.Breed
答案 0 :(得分:4)
您可以通过在记录实例上使用.
操作符来访问记录类型的属性,例如cat.Breed
。由于您正在使用Cat
记录类型的集合,因此需要在该序列上使用更高阶的函数将.
运算符应用于每个实例并访问其属性。我们将以您的示例过滤包含猫的CSV文件来演示其工作原理。
对于从第一个CSV文件生成的序列中的猫,您需要使用类似Seq.exists
的函数,根据您在其中的行来检查每只猫的Breed
属性第二个CSV文件。可能看起来像这样:
type Cat =
{ Breed: string
Color: string
Alive: bool
}
// Example CSV data type
type Row =
{ Breed: string
Color: string
Status: bool
}
let csvData =
// Load rows from CSV1
[{Breed = "fun"; Color = "lovely"; Status = true}]
|> Seq.map (fun row ->
{ Breed = row.Breed
Color = row.Color
Alive = row.Status })
// Check for matching data in CSV2
let similarData =
// Load rows from CSV2
[{Breed = "grumpy"; Color = "muddy"; Status = true}]
|> Seq.filter (fun row -> csvData |> Seq.exists (fun cat -> cat.Breed = row.Breed))
如您所见,在绑定similarData
时,我们在第二个CSV文件的每一行上使用Seq.filter
函数,以仅查找在序列生成中存在同种猫的行从第一个CSV文件开始。
答案 1 :(得分:2)
记录是一种类型。您必须迭代“mapdata”函数的结果才能访问这些属性,类似于您提供的代码中调用的Seq.map的方式。