首页 > 解决方案 > 如何从记录类型中调用字段?

问题描述

如果我有这样的类型:

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

标签: f#

解决方案


您可以通过在记录实例上使用运算符来访问记录类型的属性.,例如cat.Breed. 由于您正在处理Cat记录类型的集合,因此您需要在该序列上使用更高阶的函数来将.运算符应用于每个实例并访问其属性。我们将使用您过滤包含猫的 CSV 文件的示例来演示其工作原理。

对于从第一个 CSV 文件生成的序列中的猫,您需要使用一个函数,例如根据您在第二个 CSV 文件中所在的行Seq.exists检查每只猫的属性。Breed这可能看起来像这样:

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,我们Seq.filter在第二个 CSV 文件中的每一行上使用该函数来仅查找从第一个 CSV 文件生成的序列中存在具有相同品种的猫的行。


推荐阅读