c# - 如何比较 f# 可区分联合实例的相等性?
问题描述
一个月前,我问了关于如何使用 F# 类型实现业务规则的问题。
给定的答案对我来说效果很好,但是在使用该类型时,我通过比较该类型的两个实例而苦苦挣扎。
这是再次执行:
[<AutoOpen>]
module JobId =
open System
type JobId = private JobId of string with
static member Create() = JobId(Guid.NewGuid().ToString("N"))
static member Create(id:Guid) =
if id = Guid.Empty then None
else Some(JobId(id.ToString("N")))
static member Create(id:string) =
try JobId.Create(Guid(id))
with :? FormatException -> None
[<Extension>]
type Extensions =
[<Extension>]
static member GetValue(jobId : JobId) : string =
match jobId with
| JobId.JobId id -> id
因为它被用作标识符,所以我总是必须比较两个实例。
C#中的代码
IEnumerable<JobId> jobIds = await GetAllJobids();
JobId selectedJobId = GetSelectedJobId();
// that´s what I would like to do
if (jobIds.Any(id => id == selectedJobId))
{
...
}
// now I always have to compare the strings
if (jobIds.Any(id => id.GetValue() == selectedJobId.GetValue()))
{
...
}
我试图覆盖==
运算符,但我做不到,因为内部值不仅仅是一个简单的字段。
是否有可能达到我想要的行为?谢谢你的帮助!
解决方案
F# 联合是默认实现结构比较的 .NET 密封类,但它们不会覆盖“==”运算符。
检查 C# 中 F# 类的表示。您可以看到该.Equal
方法是如何实现的。
你能做的是
if (jobIds.Any(id => id.Equals(selectedJobId))) {}
推荐阅读
- html - 将按钮与 100% 标签并排放置
- vb.net - 图片框移动不同步
- javascript - 渲染用户 ID ExpressJS
- google-apps-script - Google Scripts Youtube 搜索 RSS 生成器
- bash - bash 脚本 - 如何重定向 time dd 命令的输出?
- authentication - Alpine 客户端不支持存储库 URL 字符串中的编码 (Jfrog)
- javascript - 如何使用正则表达式在字符串 (test1)=(tes=)t2) 的等号两侧获取匹配项
- c - 如何循环显示每 15 分钟的时间?
- javascript - 在javascript中的嵌套数组的所有嵌套数组中找到Max和Min元素
- c++ - Stroustrup 的编程中的 str_lib_facilities.h 文件:使用 C++ 生成错误的原则和实践