2017-03-25 5 views
0

Ich habe eine Liste von Zeichenfolge in meinem C# -Programm. Allerdings kenne ich die Anzahl der Elemente, die ich in meiner Liste habe, nur zur Laufzeit.Erstellen einer Kombination von Werteliste in C# .net

Sagen wir der Einfachheit halber meine Liste ist {{F1, F2, F3}, {P1, P2}, {A1, A2, A3}} Jetzt muss ich alle möglichen Kombinationen wie folgt generieren .

Unter dem Bild meiner Liste ist

enter image description here

{F1 P1 A1}, {F1 P1 A2}, {F1 P1 A3}, {F1 P2 A1}, {F1 P2 A2}, {F1 P2 A3}, {F2 P1 A1}, {F2 P1 A2}, {F2 P1 A3}, {F2 P2 A1} {F2 P2 A2}, {F2 P2 A3}, {F3 P1 A1}, {F3 P1 A2}, {F3 P1 A3}, {F3 P2 A1}, {F3 P2 A2}, {F3 P2 A3}

Kann jemand bitte dabei helfen?

+1

Sind die Werte innerhalb jeder * Unterliste * (z. B. '{A1, A2, A3}') * deutlich *? –

+0

Evtl. mit http://stackoverflow.com/questions/545703/combination-of-listlistint duplizieren –

+0

Nein, es ist keine Unterliste. Z.B. Ich habe eine String-Liste. Liste [0] ist {F1, F2, F3}. Liste [1] = {P1, P2} und Liste [2] = {A1, A2, A3}. I Aktualisieren Sie meine Frage und fügen Sie ein Bild hinzu, damit Sie es verstehen können –

Antwort

2

Linq -basierte Lösung (vorausgesetzt, dass die Liste nicht null oder empty Sublisten hat und alle Werte innerhalb der einzelnen betrachtet sublist einzigartig/verschiedene ist):

private static IEnumerable<List<T>> MyEnumerator<T>(List<List<T>> data) { 
    List<int> indexes = Enumerable.Repeat(0, data.Count).ToList(); 

    do { 
    yield return indexes 
     .Select((value, i) => data[i][value]) 
     .ToList(); 

    for (int i = data.Count - 1; i >= 0; --i) 
     if (indexes[i] == data[i].Count - 1) 
     indexes[i] = 0; 
     else { 
     indexes[i] += 1; 

     break; 
     } 
    } 
    while (indexes.Any(value => value != 0)); 
} 

Test:

List<List<String>> data = new List<List<string>>() { 
    new List<string> { "F1", "F2", "F3"}, 
    new List<string> { "P1", "P2"}, 
    new List<string> { "A1", "A2", "A3"}, 
    }; 

    var result = MyEnumerator(data).Select(list => "{" + string.Join(", ", list) + "}"); 

    Console.Write(string.Join(Environment.NewLine, result)); 

Ergebnis:

{F1, P1, A1} 
{F1, P1, A2} 
{F1, P1, A3} 
{F1, P2, A1} 
{F1, P2, A2} 
{F1, P2, A3} 
{F2, P1, A1} 
{F2, P1, A2} 
{F2, P1, A3} 
{F2, P2, A1} 
{F2, P2, A2} 
{F2, P2, A3} 
{F3, P1, A1} 
{F3, P1, A2} 
{F3, P1, A3} 
{F3, P2, A1} 
{F3, P2, A2} 
{F3, P2, A3} 

Edit:, wenn Sie eine Liste der passieren haben Komma Strings getrennt

List<string> source = new List<string> { 
    "F1,F2,F3", 
    "P1,P2", 
    "A1,A2,A3", 
    }; 

Sie benötigt List<List<string>> mit einem Linq bekommen mehr

List<List<String>> data = source 
    .Select(line => line 
     .Split(',') 
     .Distinct() 
     .ToList()) 
    .ToList(); 

    var result = MyEnumerator(data).Select(list => "{" + string.Join(", ", list) + "}"); 

    Console.Write(string.Join(Environment.NewLine, result)); 
Verwandte Themen