2016-09-29 147 views
2

我正在尝试在一些迭代中循环对话框。Microsoft Bot框架链。虽然示例

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

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

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

任何帮助或示例代码非常赞赏。

谢谢!

回答

0

这里是一个固定数的例子,而循环:

[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" 
       ); 
     } 
    } 
0

在这里是一个示例示出了电子邮件链,使用虽然请求输入的电子邮件的收件人:

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(); 
+0

这是有意义当我们收集用户输入以确定是否继续循环时,我喜欢做什么(以及需要帮助)是如何修改此代码以表现得像简单的While(i = - ; i <5;我++)循环。无需提示用户的对话框。 概念是MyDialog.While(从0开始,直到5,增加1)。 谢谢你的帮助 – gabics

相关问题