在 F# 中将枚举转换为列表、序列或通用集合类型

2023-12-02

我的类型是Dictionary<string,Node<'a>>*Edge<'a> list or a ConcurrentDictionary<string,Node<'a>>*Edge<'a> list。我正在尝试创建一个get_nodes功能,但是当我打电话时.Values来自DictionaryConcurrentDictionary,函数返回不同的类型!

所以我需要以某种方式将这两种类型转换为相同的类型,以便 F# 进行编译...

给出的类型Dictionary.Values is Dictionary'2.ValueCollection<string,Node<'a>>而产生的类型ConcurrentDictionary is ICollection<Node<'a>>.

我发现这两种类型都有一个“GetEnumerator()”函数。我需要做的是以某种方式将枚举器转换为 seq 或列表等。

这是我的代码:

   static member get_nodes (g:Graph<'a>) = 
        match g with 
        | Dictionary_Graph(nd,el) -> let n = nd.Values
                                     let enum = n.GetEnumerator()


        | ConcurrentDictionary_Graph(nd,el) -> let n = nd.Values
                                               let enum = n.GetEnumerator()

如何从枚举变量中提取数据?


您可能习惯使用 C#,它会自动将 ValueCollection 向上转换为 ICollection(由 ValueCollection 实现)。 F# 不会执行此操作,因此您必须手动将 Dictionary.Values 的结果转换为 ICollection。

let n = nd.Values :> ICollection<Node<'a>>

完整的方法看起来像这样:

static member get_nodes (g:Graph<'a>) = 
    match g with 
    | Dictionary_Graph(nd,el) ->
        nd.Values :> ICollection<Node<'a>>
    | ConcurrentDictionary_Graph(nd,el) ->
        nd.Values

据我了解,由于自动类型推理引擎的工作方式,F# 不会自动向上转型。当您习惯使用 C# 时,这会很烦人,但为了获得自动类型推断,这是值得付出的代价。还要考虑到,在 C# 中,您必须预先在方法上指定返回类型,这使得 C# 可以轻松地为您进行转换。 F# 引擎根据您实际返回的内容推断返回类型,因此最安全的做法是不要假设您希望它如何转换。

不是普遍共识,而是我的观点:我希望他们会为特定情况添加返回值的自动向上转换(例如提前声明输出类型或使分支符合上面的要求),但目前这是一个小刺激。

Update(来自评论中的问题)

ICollection<T>现在应该可以直接用作序列,因为它实现了IEnumerable<T>。在这种情况下,自动向上转换实际上起作用了。 :)

myGraph
|> Graph.get_nodes 
|> Seq.iter (fun x -> printfn "%A" x)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 F# 中将枚举转换为列表、序列或通用集合类型 的相关文章

  • Silverlight本地存储

    您可能知道 Silverlight 支持本地存储 我们正在考虑创建可在离线模式下工作的 Sl 应用程序 该应用程序可能需要在客户端缓存相当多的数据 显而易见的解决方案 由于性能问题 使用具有某种基于 XMl 结构的本地存储将无法像我们的 P
  • int -> int list 与类型 int -> IEnumerable<'a> 不兼容

    Given open System Linq 这是一个可以接受的表达方式 2 3 4 SelectMany fun n gt 1 n 但这不是 2 3 4 SelectMany fun n gt 1 n 错误消息显示 int gt int
  • 为什么 IsAssignableFrom() 不适用于 int 和 double?

    这是错误的 typeof double IsAssignableFrom typeof int 这是错误的 typeof int IsAssignableFrom typeof double 但这有效 double a 1 0 int b
  • 为什么自定义类型变量不保存值MVC

    我正在尝试使用 MVC 5 构建一个网站 我有一个包含 3 个变量的控制器类 public class WorkerController Controller public ViewModel viewModel new ViewModel
  • 如何查找局域网中所有主机上正在运行的程序的所有实例?

    出于实际目的 SqlDataSourceEnumerator 的作用是查找在 LAN 上的各个 PC 上运行的 SQL Server 的所有实例 是否有等效的方法可以查找任意应用程序的运行实例 编辑 好的 所以这只有效 因为这些应用程序有预
  • Visual Studio 2022 - 编译旧应用程序时出错

    我们正在尝试在 Visual Studio 2022 中使用 VB6 32 位应用程序 编译 2002 年以来非常旧的应用程序 我们需要调试此应用程序并能够在 Windows 10 计算机上运行此应用程序 编译时 我们发现以下错误 这似乎是
  • 如何将智能感知添加到我的应用程序中?

    我们的一款产品拥有一种专有的宏语言 通过我们的 Windows 软件进行编辑 我想添加智能感知 但我不知道如何去做 至少不完全重新发明轮子 是否有任何示例代码或第 3 方包至少可以让我开始 它不一定是免费的 该应用程序使用 NET 用 C
  • 实用程序库中应包含哪些内容[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 随着我的项目越来越多 我发现我经常从一个项目到另一个项目 从一个客户到另一个客户重复许多常见的任务 因此 我开始组装一个 实用程序 库 这是这些
  • 该组件没有由 uri 标识的资源

    我想创建一个通用数据网格以在我的所有视图 用户控件上使用 这是我的结构 Class Library called Core Class called ViewBase public class ViewBase UserControl pu
  • 如何在没有 Visual Studio 的情况下将新文件添加到 .csproj 文件

    如何添加新文件到 csproj从命令提示符 我认为没有任何工具可以响应命令行上的 add project 命令来执行此操作 但我认为您可以幸运地创建一个程序 脚本来直接操作 csproj 文件的 XML 内容 csproj 文件的结构如下所
  • 使用实体框架重叠约会

    我将 asp net mvc 与实体框架一起使用 我有一个包含 startat 字段 endat 字段和 roomid 字段 称为 SpaceConfigurationId 的约会列表 并且希望查找给定房间已重复预订的约会列表 可以假设 e
  • 为什么当要求修剪“PRN.NUL”时,TrimStart 会更多地修剪字符?

    这是代码 namespace TrimTest class Program static void Main string args string ToTrim PRN NUL Console WriteLine ToTrim string
  • 如何等待远程 .NET 调试器连接

    今天我遇到了一个问题 我需要远程调试程序 该程序是从另一个系统启动的 所以我真的没有机会在命令行上与它交互 不过我可以很容易地改变它的来源 我需要做的是让程序正常启动 然后等待我用调试器附加到它 我想不出一个让我快乐的方法 我确实发现了这个
  • .NET“默认行终止符”?

    有什么方法可以弄清楚 NET 使用什么作为其 默认行终止符 例如 StringBuilder AppendLine String 的文档表示 附加指定字符串的副本 后跟默认行终止符 NET 中的几个与文本相关的类引用相同的概念 有什么方法可
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 如何向 F# 项目添加第三方 dll 引用?

    我正在向我的 F 项目添加第三方 dll 引用 我在引用中添加了 dll 当我使用它时 即突出显示代码并执行 Alt Ent 我收到错误 命名空间或模块 AZROLESLib 未定义 我是不是错过了什么 简而言之 你必须使用 r path

随机推荐