Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何转换验证<;字符串,单位>;到';成功是空的吗?_C#_.net_Functional Programming_Language Ext - Fatal编程技术网

C# 如何转换验证<;字符串,单位>;到';成功是空的吗?

C# 如何转换验证<;字符串,单位>;到';成功是空的吗?,c#,.net,functional-programming,language-ext,C#,.net,Functional Programming,Language Ext,我对函数式编程相当陌生,我尝试在一个非常必要的代码库中工作,所以我尝试编写的代码大部分是FP,但不能完全是FP 我必须为以下方法编写一个重写 protected override string CreateEntity(XElement xe) …其中xe包含数据库更新所需的两段数据。该方法需要验证xe的内容,然后执行更新,成功时返回“”,否则返回管道分隔的错误列表 我从语言ext测试中得到了一个提示,并编写了一些助手方法,如以下所示(实现与示例非常相似,因此省略了) 我不知道这是否是最好的方

我对函数式编程相当陌生,我尝试在一个非常必要的代码库中工作,所以我尝试编写的代码大部分是FP,但不能完全是FP

我必须为以下方法编写一个重写

protected override string CreateEntity(XElement xe)
…其中
xe
包含数据库更新所需的两段数据。该方法需要验证
xe
的内容,然后执行更新,成功时返回“”,否则返回管道分隔的错误列表

我从语言ext测试中得到了一个提示,并编写了一些助手方法,如以下所示(实现与示例非常相似,因此省略了)

我不知道这是否是最好的方法,所以欢迎提出任何建议

我更大的问题是下一步该做什么。下面的作品很管用,但在我看来不是很优雅或优雅

returnvalidation.IsFail
? string.Join(“|”,validation.FailAsEnumerable())
: "";

有更好的方法吗?

如果验证失败,您只需抛出一个异常即可。 以后调用代码的人可以对代码应用异常处理


另一个选项是发送错误代码而不是消息。在这种情况下,被调用方可以将每个错误代码转换为特定错误。

代码的最后一部分(格式错误)可以这样做:

[事实]
无效测试()
{
验证结果fromdatabase=失败(“错误”);
var-batherror1=string.Join(“|”,resultFromDatabase.FailToSeq());//请使用FailToSeq()将返回空seq的事实来获得成功
var-showError2=string.Join(|),resultFromDatabase.IfSuccess(Seq());//为成功案例显式提供错误类型(Seq)的值
var-batherror3=resultFromDatabase.Match(=>“”,errors=>string.Join(|“”,errors));//仅调用string.Join查找错误
}
以你最喜欢的变体为例。如果希望代码干净/不依赖FailToSeq()实现来处理这两种情况,则应使用
Match
IfSuccess
/
IfFail
明确处理这两种情况

如果你想改进你的整体设计(避免不纯的代码),你可能需要改变一些基本的东西。一个(非常灵活的)选择是使用免费的Monad,LanguageExt在这方面取得了进展,但转换传统的OO代码库可能是一个很大的进步。见:

(使用CodeGen的免费Monad)

感谢您的回复,但正如我所说的,我需要覆盖现有的方法,因此无法更改调用代码的功能。我必须返回一个字符串,如果一切正常,该字符串将为空,否则将包含以管道分隔的错误。@avrohmyisroel在这种情况下,您编写的是可以的,如果您确实需要组合返回错误消息,我看不到其他选项。谢谢。我没有任何理由不想使用
FailToSeq()
(有什么理由我应该这么做吗?),这提供了一个简洁的解决方案。我很乐意采用一种非常灵活的方法,但我的工作有一个非常庞大的、非常必要的代码库,而且我的经理也不太热衷于彻底的改变。我也被我的理解力不足所阻碍,尽管随着我的努力,我的理解力越来越强。再次感谢,不客气。采取低挂果实来改进本地代码是完全好的。关于
FailToSeq()
:如果您也将其称为“success”,则会增加两个(小)风险:如果LanguageExt中的实现发生更改(例如,在“success”=>异常中不允许此操作),则会导致代码中断。我不认为Paul会改变这一点(但单元测试似乎没有涵盖这一点)。第二个风险是,代码的读者可能想知道在“成功”的情况下(异常与空结果)会发生什么。取决于您的上下文,整体可读性。。。
private Validation<string, int> ValidateRegionID(XElement xe)