2016-09-29 5 views
2

Ich versuche, einen Dialog in einer Reihe von Iterationen zu loopen.Microsoft Bot Framework Chain.While Beispiel

Beispiel: Ich möchte 5 mal hintereinander eine Frage stellen (mit anderen Parametern). Ich bin in der Lage, meinen Dialog unendlich mit MyDialog.Loop() zu schleifen - kein Problem.

Aber ich brauche eine endliche Zahl - ich dachte, ich brauche Chain.While().

Bisher kein Erfolg und ich kann keine Beispiele für die Verwendung Chain.While() finden.

Jede Hilfe oder Beispielcode wird sehr geschätzt.

danke!

Antwort

0

Hier ein Beispiel für eine feste Anzahl ist while-Schleife:

[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

Hier ist eine Probe, die eine E-Mail-Kette zeigt, die zwar mit den E-Mail der Empfänger zu fragen:

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

Das macht Sinn wenn die Benutzereingaben gesammelt wurden, um festzustellen, ob die Schleife fortgesetzt werden soll oder nicht. Was ich gerne mache (und Hilfe brauche), ist, wie dieser Code so geändert wird, dass er sich wie das einfache While verhält (i = -; i <5; i ++) Schleife. Keine Notwendigkeit für einen Dialog, der den Benutzer auffordert. Das Konzept ist MyDialog.While (von 0 beginnen, bis 5 gehen, um 1 erhöhen). Vielen Dank für Ihre Hilfe – gabics

Verwandte Themen