【问题标题】:Microsoft Bot Framework Chain.While exampleMicrosoft Bot Framework Chain.While 示例
【发布时间】:2016-09-29 00:41:54
【问题描述】:

我试图在多次迭代中循环一个对话框。

示例:我喜欢连续问一个问题 5 次(使用不同的参数)。我可以用MyDialog.Loop() 无限循环我的对话 - 没问题。

但我需要一个有限的数字 - 我想我需要使用 Chain.While()。

到目前为止没有成功,我找不到任何使用 Chain.While() 的示例。

非常感谢任何帮助或示例代码。

谢谢!

【问题讨论】:

    标签: c# botframework


    【解决方案1】:

    这是一个固定计数 while 循环的示例:

        [TestMethod]
        public async Task SampleChain_While_Count()
        {
            var root =
                Chain
                .PostToChain()
                .Select(_ => (IReadOnlyList<string>)Array.Empty<string>())
                .While
                (
                    items => Chain
                                .Return(items)
                                .Select(i => i.Count < 3),
                    items => Chain
                                .Return(items)
                                .Select(i => $"question {i.Count}")
                                .PostToUser()
                                .WaitToBot()
                                .Select(a => items.Concat(new[] { a.Text }).ToArray())
                )
                .Select(items => string.Join(",", items))
                .PostToUser();
    
            using (var container = Build(Options.ResolveDialogFromContainer | Options.Reflection))
            {
                var builder = new ContainerBuilder();
                builder
                    .RegisterInstance(root)
                    .As<IDialog<object>>();
                builder.Update(container);
    
                await AssertScriptAsync(container,
                    "hello",
                    "question 0",
                    "A",
                    "question 1",
                    "B",
                    "question 2",
                    "C",
                    "A,B,C"
                    );
            }
        }
    

    【讨论】:

      【解决方案2】:

      这是一个显示电子邮件链的示例,使用 While 来询问电子邮件收件人:

      Func<string, IDialog<string>> Ask = toUser =>
          Chain.Return(toUser)
          .PostToUser()
          .WaitToBot()
          .Select(m => m.Text);
      
      IDialog<IReadOnlyList<string>> recipientsDialog =
          Chain
          .Return(Array.Empty<string>())
          .While(items => Ask($"have {items.Length} recipients, want more?").Select(text => text == "yes"),
          items => Ask("next recipient?").Select(item => items.Concat(new[] { item }).ToArray()));
      
      var emailDialog = from hello in Chain.PostToChain().Select(m => m.Text + " back!").PostToUser()
                          from subject in Ask("what is the subject?")
                          from body in Ask("what is the body?")
                          from recipients in recipientsDialog
                          select new { subject, body, recipients };
      
      var rootDialog = emailDialog
          .Select(email => $"'{email.subject}': '{email.body}' to {email.recipients.Count} recipients")
          .PostToUser();
      

      【讨论】:

      • 当收集用户输入以确定是否继续循环时,这是有道理的。我喜欢做的(并且需要帮助)是如何修改此代码以使其表现得像简单的 While (i=-;i
      猜你喜欢
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 2017-11-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多