小编Law*_*nce的帖子

C#与F#的默认排序

考虑代码两个片段,简单地订购串C#F#分别为:

C#:

var strings = new[] { "Tea and Coffee", "Telephone", "TV" };
var orderedStrings = strings.OrderBy(s => s).ToArray();
Run Code Online (Sandbox Code Playgroud)

F#:

let strings = [| "Tea and Coffee"; "Telephone"; "TV" |]
let orderedStrings =
    strings
    |> Seq.sortBy (fun s -> s)
    |> Seq.toArray
Run Code Online (Sandbox Code Playgroud)

这两个代码片段返回不同的结果:

  • C#:茶和咖啡,电话,电视
  • F#:电视,茶和咖啡,电话

在我的具体情况下,我需要关联这两种语言之间的排序逻辑(一种是生产代码,一种是测试断言的一部分).这提出了几个问题:

  • 订购逻辑存在差异的根本原因是什么?
  • 在我的情况下,克服这个"问题"的推荐方法是什么?
  • 这种现象是否特定于字符串,还是也适用于其他.NET类型?

编辑

在回答几个探测性评论时,运行下面的片段可以更多地了解这种排序差异的确切性质:

F#:

let strings = [| "UV"; "Uv"; "uV"; "uv"; "Tv"; "TV"; "tv"; "tV" |]
let orderedStrings =
    strings
    |> Seq.sortBy (fun s -> s)
    |> …
Run Code Online (Sandbox Code Playgroud)

c# sorting string f# collation

18
推荐指数
2
解决办法
606
查看次数

从msbuild中的命令行导入.targets文件

我目前正在使用msbuild构建多个项目.我对由.targets文件处理的构建进行了一个小的自定义.一种解决方案是添加代码段

<Import Project="MyTargets.targets"/>
Run Code Online (Sandbox Code Playgroud)

到每个项目文件.但是,理想情况下我不想触摸项目文件,并能够将此信息作为参数传递给msbuild.这样我就可以轻松控制是否从命令行运行此自定义,而且我不必触摸现有的项目文件.

这可能吗?

msbuild command-line target

9
推荐指数
1
解决办法
4985
查看次数

序列化F#选项类型

考虑下面的F#片段:

type MyType = {  
    CrucialProperty: int
    OptionalProperty: string option 
}

let first = { CrucialProperty = 500; OptionalProperty = Some("Hello")}
let second = { CrucialProperty = 500; OptionalProperty = Some(null)}
let third = { CrucialProperty = 500; OptionalProperty = None}
Run Code Online (Sandbox Code Playgroud)

我希望使用JSON.NET对此类型进行序列化,因此我分别针对上述情况获取以下字符串:

{"CrucialProperty":500,"OptionalProperty":"Hello"}
{"CrucialProperty":500,"OptionalProperty":null}
{"CrucialProperty":500}
Run Code Online (Sandbox Code Playgroud)

从本质上讲,问题归结为能够根据该属性的值在序列化输出中包含/排除属性.

我已经设法在那里找到了一些"OptionConverters"(例如这里),但它们似乎并不像我正在寻找的那样.

f# json.net

9
推荐指数
1
解决办法
1149
查看次数

我可以在内存中运行LocalDb吗?

我在集成测试环境中使用LocalDb - 在我的测试运行之前和之后实例化和处理我的实例.

但是,当我在我的实例中创建数据库时,它仍然将我的表和数据刷新到磁盘.是否可以在"内存"模式下运行LocalDb?如果是这样怎么样?

localdb

6
推荐指数
2
解决办法
2323
查看次数

评估Lambda表达式作为表达式树的一部分

我正在尝试使用表达式树构建一个lambda表达式.这是我试图创建的lambda表达式的格式:

Func<DateTime, string> requiredLambda = dt =>
    {
        var formattedDate = dt.ToShortDateString();

        /**
        * The logic is not important here - what is important is that I 
        * am using the result of the executed lambda expression.
        * */
        var builder = new StringBuilder();
        builder.Append(formattedDate);
        builder.Append(" Hello!");
        return builder.ToString();
    };
Run Code Online (Sandbox Code Playgroud)

问题是我不是从头开始构建这个树 - 格式化逻辑已经以一个实例的形式传递给我Expression<Func<DateTime, string>>- 比如说:

Expression<Func<DateTime, string>> formattingExpression = dt => dt.ToShortDateString();
Run Code Online (Sandbox Code Playgroud)

我知道外面的表达式树的我可以打电话

formattingExpression.Compile()(new DateTime(2003, 2, 1)) 
Run Code Online (Sandbox Code Playgroud)

评估表达式 - 但问题是我希望表达式树中评估和分配它- 允许我在表达式树中对结果执行额外的逻辑.

到目前为止,我没有想到的任何事情似乎都是这样做的 - 几乎可以肯定是对表达树如何工作的误解.任何帮助非常感谢!

c# lambda expression-trees

5
推荐指数
1
解决办法
2060
查看次数

如何使用websockets

如何使用Fable从中消耗数据并将数据推送到websocket?我发现这个github问题表明它可以完成,但找不到任何文档或如何实现这一目的的示例.

f# fable-f#

5
推荐指数
1
解决办法
1101
查看次数

解析递归数据结构

我希望使用F#将字符串解析为递归数据结构.在这个问题中,我将提出一个简化的例子,它将切入我想要做的事情的核心.

我想将一串嵌套的方括号解析为记录类型:

type Bracket = | Bracket of Bracket option
Run Code Online (Sandbox Code Playgroud)

所以:

  • "[]" - > Bracket None
  • "[[]]" - > Bracket ( Some ( Bracket None) )
  • "[[[]]]" - > Bracket ( Some ( Bracket ( Some ( Bracket None) ) ) )

我想使用FParsec库中的解析器组合器来完成此操作.这是我到目前为止:

let tryP parser = 
    parser |>> Some
    <|>
    preturn None

/// Parses up to nesting level of 3
let parseBrakets  : Parser<_> = 

let mostInnerLevelBracket = 
    pchar '[' 
    .>> pchar ']'
    |>> fun _ -> Bracket None …
Run Code Online (Sandbox Code Playgroud)

f# fparsec

5
推荐指数
1
解决办法
177
查看次数

在curried的参数中通过引用传递参数

我正在尝试IDispatchMessageInspector在F#中实现(WCF名声)界面:

open System.ServiceModel.Dispatcher
open System.ServiceModel.Channels

type ServiceInterceptor() as interceptor = 

    abstract member PreInvoke : byref<Message> -> obj
    abstract member PostInvoke : byref<Message> -> obj -> unit

    default x.PreInvoke m = null
    default x.PostInvoke m s = ()

    interface IDispatchMessageInspector with
         member x.AfterReceiveRequest(request, channel, instanceContext) = interceptor.PreInvoke(&request)
         member x.BeforeSendReply(reply : byref<Message>, correlationState) = interceptor.PostInvoke &reply correlationState
Run Code Online (Sandbox Code Playgroud)

无法编译时出现以下错误:

在此输入图像描述

但是,如果我将代码修改为以下内容(请注意签名的更改PostInvoke),一切正常:

open System.ServiceModel.Dispatcher
open System.ServiceModel.Channels

type ServiceInterceptor() as interceptor = 

    abstract member PreInvoke : byref<Message> -> obj
    abstract member PostInvoke …
Run Code Online (Sandbox Code Playgroud)

f#

3
推荐指数
1
解决办法
166
查看次数