你如何从记录类型中调用字段?

时间:2018-06-19 05:20:05

标签: f#

如果我有这样的类型:

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

2 个答案:

答案 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的方式。