【问题标题】:Compose immutable F# map of list of strings编写字符串列表的不可变 F# 映射
【发布时间】:2012-10-27 23:37:30
【问题描述】:

在 C# 中,我可以很容易地构建 Dictionary<string, List<string>>。如果我正在阅读大型项目数据库,我可以执行以下操作:

var dict = new Dictionary<string, List<string>>();
foreach(string[] row in data)
   if (!dict.ContainsKey(row[0]))
      dict.add(row[0], new List<string>() { row };
   else
      dict[row[0]].add(row);

现在的问题是,我如何在 f# 中使用不可变的 Map&lt;string, string list&gt; 执行此操作?

【问题讨论】:

    标签: c# dictionary map f# idioms


    【解决方案1】:
    data
    |> Seq.groupBy (fun row -> row.[0])
    |> Map.ofSeq
    

    【讨论】:

      【解决方案2】:

      这是一个更详细的解决方案,与您的 C# 示例非常相似:

      data |> Seq.fold (fun map row -> 
                       match Map.tryFind row.[0] map with
                       | Some rows -> Map.add row.[0] (row::rows) map
                       | None -> Map.add row.[0] [row] map) Map.empty
      

      【讨论】:

      • 我喜欢 fold 的用法,但 Daniel 对高阶函数的使用更惯用。
      • 同意——这是一个补充解决方案。
      • 我很好奇,这怎么接近?它使用了更多像 C# 这样的字符?
      • 是的,它更冗长。 Seq.fold 类似于带有累加器字典的foreach
      • 我也很欣赏这个答案,因为它帮助我了解在没有好的高级功能可以使用的情况下如何使用地图。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-20
      • 2021-08-15
      • 2018-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多