小编Ale*_*lex的帖子

为什么C#8的switch表达式在表达式树中无效?

考虑 AutoMapper 中的以下代码

CreateMap<ViewModel, ServiceModel>()
    .ForMember(
        x => x.Type,
        opt => opt.MapFrom(y =>
            y.TypeName switch
            {
                "FirstName" => typeof(FirstModel),
                "SecondName" => typeof(SecondModel),
                _ => null
            }));
Run Code Online (Sandbox Code Playgroud)

我有几种不同的情况,我想为每个字符串返回特定类型。

编译器不同意:

表达式树不能包含 switch 表达式。

这是为什么?我希望这个功能(在内部被巧妙地称为表达式)执行Expression.Switch,因此应该可以在表达式树中使用。

我知道我可以用三元运算符语法替换。我想了解为什么它不起作用。

编辑

感谢Sweeper指出这实际上不是一个 switch 表达式。我想我是被带上了会议列车并被名字愚弄了。

Ivan Stoev我知道它不受支持,但我很好奇为什么。我理解为什么不支持块作用域,但 switch case 本质上非常简单且具有声明性,这非常适合表达式树。

编辑 2 感谢下面的Jeroen Mostert评论,我现在了解到 switch case 内部远非简单,因此它在表达式树中没有位置。

c# expression expression-trees c#-8.0

5
推荐指数
0
解决办法
3475
查看次数

Java流API将lambda表达式存储为变量

这个标题对我来说听起来很愚蠢,但必须至少有一些聪明的方法才能达到这样的效果,我不知道怎么解释它.我需要使用sorted in stream API对数组进行排序.到目前为止,这是我的流:

Arrays.stream(sequence.split(" "))
        .mapToInt(Integer::parseInt)
        .boxed()
        .sorted((a, b) -> a.compareTo(b))
        .forEach(a -> System.out.print(a + " "));
Run Code Online (Sandbox Code Playgroud)

现在我有两种不同的过程 - 升序和降序,我需要使用的排序在用户输入中指定.所以我想做的就是切换2个案例:"升序"和"降序"以及分别存储lambda表达式的变量:

switch(command) {
    case "ascending": var = a.compareTo(b);
    case "descending": var = b.compareTo(a);
}
Run Code Online (Sandbox Code Playgroud)

然后我的排序看起来像:

 .sorted((a, b) -> var)
Run Code Online (Sandbox Code Playgroud)

我在参加的python课程中得到了这个想法.在那里可以将对象存储在变量中,从而使变量"可执行".我意识到这个lambda不是一个对象,而是一个表达式,但我要问的是有什么聪明的方法可以达到这样的结果,或者我应该只是

if(var)
Run Code Online (Sandbox Code Playgroud)

每个排序顺序有两个不同的流.

java lambda java-8 java-stream

3
推荐指数
2
解决办法
2570
查看次数

Redux可观察到的史诗链调度重复动作

传说

action-chain epic= Epic,根据服务调用返回“成功”或“失败”动作。 service=来自HttpModuleAngular2的Http服务

目标

我需要将数据发送到服务器。我有一个CREATECREATE_SUCCESSCREATE_FAIL行动。我的想法是CREATE在提交时发送。然后,我有一个action-chain epic,它开始service调用我的服务器并触发CREATE_SUCCESSCREATE_FAIL根据响应进行触发。

问题

action-chain epic会触发重复的动作-在这两种情况下,都会触发两个动作,例如:如果成功,则每个动作都会CREATE调度两个CREATE_SUCCESS动作。

代码

 private createAnimalActionChain() {
        return action$ => {
            return action$
                .ofType(AnimalActions.CREATE)
                .switchMap(action => {
                    return this.service
                        .create(action.payload)
                        .map(httpResponse => {
                            let response = httpResponse.json()
                            if (response.success) {
                                return this.actions.createSuccess()
                            }

                            return this.actions.createFail(response.errors)
                        })
                })
        }
    }
Run Code Online (Sandbox Code Playgroud)

这就是我撰写的内容,并且大部分都在起作用。如果有更好的方法,我全神贯注。直到最近,分派多个动作才不是真正的问题,但是对我来说似乎从来没有问题,所以我很乐意修复它。

编辑:我刚刚发现,有时我的应用程序会在执行任何Epic之前分派重复的动作。我现在正试图了解原因。

编辑2:没关系编辑。这是一个孤立的情况,submit事件一直冒泡到顶部,并且因为我将 …

redux redux-observable angular

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