嵌套Lambda表达式而不是foreach

时间:2018-09-05 22:04:07

标签: c# lambda foreach

@Override
public void start(Stage primaryStage) throws Exception {
    String[] options = new String[]{"A", "B", "C", "D", "E", "F"};
    GridPane grid = new GridPane();

    for (int i = 0; i < options.length; i++) {
        final int row = i;
        String option = options[i];
        CheckBox checkBox = new CheckBox(option);

        ChoiceBox<Integer> choice = new ChoiceBox<>();
        Label label = new Label("How many of the selected accounts do you have?");
        choice.getItems().addAll(1, 2, 3, 4, 5);

        VBox choiceContainer = new VBox(label, choice);

        checkBox.selectedProperty().addListener((o, oldValue, newValue) -> {
            if (newValue) {
                grid.add(choiceContainer, 1, row);
            } else {
                grid.getChildren().remove(choiceContainer);
            }
        });

        grid.add(checkBox, 0, row);
    }

    Scene scene = new Scene(grid);

    primaryStage.setScene(scene);
    primaryStage.show();
}

这是代码。 如何为上述foreach语句编写lambda?我正在尝试,但无法获得最佳解决方案,所以任何人都可以吗?

2 个答案:

答案 0 :(得分:1)

Linq 扩展方法不应真正尝试解决所有问题。但是,如果您确实需要一个语句中的所有内容,则可以使用它。

AList.SelectMany(x => x.body.positions)
     .ToList()
     .ForEach(
         position => 
            position.NameOfWeek = weekList.Where(x => x.NameOfWeek == position.NameOfWeek)
                                          .Select(y => y.NameOfWeek)
                                          .FirstOrDefault());

注意 :如果此内容出现在我的办公桌上供代码检查,请id将其发送回并附带一条注释,说“我的眼睛”! ,请重构。

基本上,您的原始foreach易于阅读和维护。它并不想太花哨,您可以轻松地看到发生了什么。要使所有内容都在一个声明中,这些特质就变得更加重要。

答案 1 :(得分:1)

那么,您可以使用linq函数SelectMany。这是修改后的版本:

foreach(var position in AList.SelectMany(k => k.body.positions)) {
    position.NameOfWeek = weekList
                        .Where(x => x.NameOfWeek.ToString() == position.NameOfWeek)
                        .Select(y => y.NameOfWeek)
                        .FirstOrDefault();
}