2010-03-13 3 views
1

je besoin d'un conseil sur la façon de créer un nouveau tableau de chaînes de 4 tableaux de chaînes différentes:C# ajouter des éléments de chaîne de 4 différents tableaux de chaînes avec l'autre

Nous avons 4 tableaux de chaînes:

string[] arr1 = new string [] {"a1","a2","a3"..., "a30"}; 
string[] arr2 = new string [] {"d10","d11","d12","d13","d14","d15"}; 
string[] arr3 = new string [] {"f1","f2","f3"...,"f20"}; 
string[] arr4 = new string [] {"s10","s11","s12","s13","s14"}; 

Nous besoin d'ajouter tous les éléments de chaîne de tous les 4 tableaux les uns aux autres comme celui-ci:

a1+d10+f1+s10 
a2+d10+f1+s10 

...  
a1+d11+f1+s10 
a2+d11+f1+s10 
... 
a30+d15+f20+s14 

Je veux dire toutes les combinaisons dans cet ordre: arr1_element, arr2_element, arr3_element, arr4_element
Donc le tableau des résultats serait comme ça:
string [] arr5 = new string [] {"a1d10f1s10", "a2d10f1s10" ....};

Répondre

1

Faire une méthode récursive qui renvoie toutes les combinaisons des tableaux:

static IEnumerable<string> GetCombinations(string[][] arrays, int len, string start) { 
    foreach (string s in arrays[len - 1]) { 
    if (len == 1) { 
     yield return s + start; 
    } else { 
     foreach (string r in GetCombinations(arrays, len - 1, s + start)) { 
     yield return r; 
     } 
    } 
    } 
} 

Utilisation:

string[][] arrays = { arr1, arr2, arr3, arr4 }; 
foreach (string s in GetCombinations(arrays, arrays.Length, string.Empty)) { 
    Console.WriteLine(s); 
} 
+0

Merci pour la réponse rapide et précieuse. On dirait que ça devrait bien marcher mais ça ne donne que la dernière corde. Je ne sais pas ce que je fais mal. –

+0

@new_coder: Le code est testé et renvoie toutes les combinaisons. Notez que la méthode ne place pas toutes les combinaisons dans une collection énorme, mais renvoie une combinaison à la fois. Vous devez parcourir le résultat et gérer chaque chaîne à la fois. – Guffa

+0

Merci pour votre note. Je suis nouveau à la programmation pouvez-vous me lier où puis-je lire sur la façon de «faire une boucle sur le résultat et gérer chaque chaîne à la fois» ou donnez-moi un exemple s'il vous plaît. Merci beaucoup! –

0

Quelque chose de semblable à cela pourrait fonctionner ...

List<string> AddEntries(List<List<string>> entries) { 
    List<string> finalEntries = new List<string>(); 

    if (entries != null && entries.Length > 0) { 
     if (entries.Length > 1) { 
     foreach(string entry in entries) { 
      foreach(string subentry in AddEntries(entries.Skip(1)) { 
       finalEntries.Add(entry + subEntry); 
      } 
     } 
     } else { 
     foreach(string entry in entries[0]) { finalEntries.add(entry); } 
     } 
    } 
    return finalEntries; 
} 

I Apologize pour le code, je n'ai pas de compilateur ici pour tester. Suppose que vous utilisez C# 3.5 avec des méthodes d'extension. J'ai pris la liberté de changer votre chaîne [] à List. Si vous n'utilisez pas 3.5, vous devrez écrire votre propre fonction pour réduire les tableaux imbriqués.

+0

Je pense que vous voulez dire .NET 3.5 ou C# 3.0. Il n'y a pas de C# 3.5. Il n'y a pas non plus de signes de méthodes d'extension dans votre code ... –

+0

Oui @Jon Skeet, je voulais dire framework 3.5, mon mal pour taper si vite. Entries.Skip() J'ai pensé qu'il s'agissait d'une extension car elle ne fait pas partie de l'implémentation par défaut de la liste . – GrayWizardx

+0

Ah oui, je n'avais pas vu l'appel à Skip. –

-1

vous devez utiliser la méthode d'extension C# 4.0 .Zip() pour IEnumerable <> collections. La méthode prend deleagate comme paramètre dans ce but. Exemple:

List<string> a = new List<string> { "code" }; 
    List<int> b = new List<int>() { 7 }; 
    var res = a.Zip(b, (p1, p2) => p1.ToString() + p2.ToString()); 
+0

Vous devriez lire ce que fait la méthode. Il ne crée pas de combinaisons entre les éléments, il ne fait que jumeler les éléments avec le même index. – Guffa

+0

Guffa, j'ai fourni un échantillon pour vous. –

+0

@portland: Il vous manque complètement le point. Je ne demandais pas un exemple, je soulignais que la méthode ne fait pas ce que le PO demandait. – Guffa

1

une fois à un concours de programmation je présente. Cela a bien fonctionné. Voyez si cela fonctionne pour vous.

:)

private static IEnumerable<string> 
    GetCombinations(string[] arr1, string[] arr2, string[] arr3, string[] arr4) 
     { 
      int i, j, k, l; 
      i = j = k = l = 0; 

      for (i = 0; i < arr4.Length; i++) 
       for (j = 0; j < arr3.Length; j++) 
        for (k = 0; k < arr2.Length; k++) 
         for (l = 0; l < arr1.Length; l++) 
          yield return (arr1[l] + arr2[k] + arr3[j] + arr4[i]); 

     } 

Exemple d'utilisation:

public static void Main(string[] args) 
{ 
    string[] arr1 = new string[] { "a1", "a2", "a3", "a30" }; 
    string[] arr2 = new string[] { "d10", "d11", "d12", "d13" }; 
    string[] arr3 = new string[] { "f1", "f2", "f3", "f20" }; 
    string[] arr4 = new string[] { "s10", "s11", "s13", "s14" }; 


    var list = GetCombinations(arr1, arr2, arr3, arr4); 

    foreach (var item in list.Take<string>(10)) 
    { 
     Console.WriteLine(item); 
    } 
} 
+0

Merci pour votre réponse. C'est incroyable code "compact"! :) et il semble que cela devrait fonctionner - mais j'ai le même problème, il ne résulte que la dernière chaîne –

+0

Je voulais rendre le rendement, mais ma connexion Internet était en panne pour la journée. Fait maintenant. :) –

+0

Nous vous remercions de votre aide! Votre code fonctionne correctement et est très utile. –

1

LINQ est très pratique dans ce cas:

var arr1 = new [] { "a1", "a2", "a3", "a4", "a5" }; 
var arr2 = new [] { "b1", "b2", "b3", "b4", "b5" }; 
var arr3 = new [] { "c1", "c2", "c3", "c4", "c5" }; 
var arr4 = new [] { "d1", "d2", "d3", "d4", "d5" }; 

var arr5 = (from a in arr1 
      from b in arr2 
      from c in arr3 
      from d in arr4 
      select a + b + c + d).ToList(); 

Ce 5 lignes de code renverrait:

a1b1c1 
a1b1c2 
a1b1c3 
a1b1c4 
a1b1c5 
a1b2c1 
a1b2c2 
[...] 
a2b1c1 
a2b1c2 
a2b1c3 
a2b1c4 
a2b1c5 
a2b2c1 
a2b2c2 
a2b2c3 
a2b2c4 
a2b2c5 
a2b3c1 
[...] 
a5b5c4 
a5b5c5 
Questions connexes