2017-09-28 1 views
1

Ich brauche ein wenig Hilfe in die richtige Richtung, um mein Projekt zu starten. Lassen Sie mich die Situation erklären, indem Sie ein kleines Beispiel geben:Generieren Sie eine Matrix von verschiedenen Wegen aus Fragen ?, Permutationen ?, Kombinationen?

Zum Beispiel habe ich 3 Fragen, die mit wahr oder falsch beantwortet werden können. Ich möchte einen Überblick über alle möglichen Antwortkombinationen erhalten.
Zum Beispiel:

Question 1   Question 2   Question 3 
True    True    True 
True    False    True 
False    True    False 

Und so weiter ...
Hat jemand eine Idee, wie ich ein Werkzeug vorzugsweise in C# programmieren können, die eine Matrix wie oben mit allen möglichen Ergebnisse erzeugt?

Vielen Dank für Feedback oder Ideen, die Sie haben könnten!
Grüße Tim

+2

Hinweis: Für N Fragen, dies ist die gleiche A mit einer Binärzahl mit N Bits, einen maximalen Wert von (2^N) geben -1. Sie können daher ein int verwenden, um von 0 bis (2^N) -1 zu zählen und die unteren N Bits zu betrachten. Jedes 1 Bit entspricht "True" und jedes 0 Bit entspricht "False". –

Antwort

0

Total von Grund auf neu geschrieben. Stellen Sie sich vor Sie N Fragen (3 in der Demo) haben:

string[][] questionsAndAnswers = new string[][] { 
    // Two times Two is Four? 
    new string[] { "true", "false"}, 
    // What is the capital of Russia? 
    new string[] { "Berlin", "Moscow", "London"}, 
    // Sqrt(3 * 3 + 4 * 4) = ? 
    new string[] { "1", "2", "3", "5"}, 
    }; 

zunächst als true/false beantwortet werden können, die zweite - eine von drei Städten etc. Dann Sie Sie alle möglichen Antworten mit einer einfachen Routine aufzählen kann:

private static IEnumerable<string> Generator(string[][] answers) { 
    int[] indexes = new int[answers.Length]; 

    while (true) { 
    yield return string.Join("\t", answers 
     .Select((answer, idx) => answer[indexes[idx]])); 

    for (int i = 0; i < indexes.Length; ++i) { 
     if (indexes[i] < answers[i].Length - 1) { 
     indexes[i] += 1; 

     break; 
     } 
     else { 
     if (i == indexes.Length - 1) 
      yield break; 

     indexes[i] = 0; 
     } 
    } 
    } 
} 

Zum Beispiel:

string caption = string.Join("\t", Enumerable 
    .Range(1, questionsAndAnswers.Length) 
    .Select(i => $"Question {i}")); 

    // Or loop - foreach - instead of Join 
    string body = string.Join(Environment.NewLine, Generator(questionsAndAnswers)); 

    string report = string.Join(Environment.NewLine, caption, body); 

    Console.WriteLine(report); 

Ergebnis:

Question 1 Question 2 Question 3 
true Berlin 1 
false Berlin 1 
true Moscow 1 
false Moscow 1 
true London 1 
false London 1 
true Berlin 2 
false Berlin 2 
true Moscow 2 
false Moscow 2 
true London 2 
false London 2 
true Berlin 3 
false Berlin 3 
true Moscow 3 
false Moscow 3 
true London 3 
false London 3 
true Berlin 5 
false Berlin 5 
true Moscow 5 // <- The right answer 
false Moscow 5 
true London 5 
false London 5 
+0

Danke für die Eingabe! Aber ich frage mich, gibt es eine Möglichkeit, das gleiche Ergebnis von einer Schleife zu bekommen? Die Problembeschreibung ist sehr einfach. Die Situation ist, dass ich einen Fragebogen habe, wo einige Fragen mit wahr oder falsch beantwortet werden können, einige sind offene Fragen, und einige Fragen haben mehrere Antworten. Ist es möglich, etwas wie die obige Matrix zu erstellen, aber mit den anderen Arten von Fragen im Hinterkopf? Danke für jede Hilfe, die Sie anbieten können! –

+0

@Tim Occhipinti: sicher, dass Sie 'Join' in eine Schleife verwandeln können, sehen Sie meine Bearbeitung. –

+0

@Tim Occhipinti: Wenn Sie * verschiedene Arten * von Fragen haben, bitte * spezifizieren * sie, mit einer Hilfe, sagen Sie eine * maßgeschneiderte Klasse * 'QuestionKind'. –

0

Wenn Sie wirklich, wie hässlich lambdas, dies kann es in einer Linq-Anweisung tun:

var q1 = new string[] { "true", "false" }; 
var q2 = new string[] { "Berlin", "Moscow", "London" }; 
var q3 = new string[] { "1", "2", "3", "5" }; 

var combos = q1.Join(q2, _q1 => true, _q2 => true, (q11, q22) => new { q11, q22 }).Join(q3, _q3 => true, _q2 => true, (q11, q33) => new {q11.q11, q11.q22,q33}); 
combos.Dump(); 

Es ist 2 Linq (Kreuz) die Listen in einer abschließenden Liste aller möglichen Kombinationen zu kombinieren verbindet.

Output:

Question1 Question2 Question3  
true Berlin 1 
true Berlin 2 
true Berlin 3 
true Berlin 5 
true Moscow 1 
true Moscow 2 
true Moscow 3 
true Moscow 5 
true London 1 
true London 2 
true London 3 
true London 5 
false Berlin 1 
false Berlin 2 
false Berlin 3 
false Berlin 5 
false Moscow 1 
false Moscow 2 
false Moscow 3 
false Moscow 5 
false London 1 
false London 2 
false London 3 
false London 5 
Verwandte Themen