GQ08 II: combinaisons


Encore un petit assez simple mais attention, bonus pour celui qui l’écrit en C# classique sans utiliser la ‘sugar syntax’ de Linq.
Je voudrais lister l’ensemble des associations possibles avec les éléments de ces deux tableaux.

var values1 = new string[] { "1", "2", "3" }; var values2 = new string[] { "A", "B" }; var q = ? foreach (var v in q) Console.WriteLine(v);

image

Mitsu

Comments (10)

  1. public static IEnumerable<string> Combinaisons(IEnumerable<string> values1, IEnumerable<string> values2)

    {

       foreach (string v1 in values1)

           foreach (string v2 in values2)

               yield return string.Concat(v1, v2);

    }

    var q = Combinaisons(values1, values2);

  2. Sinon en LINQ ça donnerait ça :

    var q = from v1 in values1

           from v2 in values2

           select string.Concat(v1, v2);

  3. Mitsu Furuta says:

    Eh oh Matthieu, on n’est pas la pour faire du C# 2.0 ! :p

    J’attends une écriture plus moderne, cependant je reviendrai sur ta solution un peu plus tard.

  4. C’est sûrement pas ce que t’attend mais tu peux faire ça :

    var values1 = new string[] { "1", "2", "3" };

    var values2 = new string[] { "A", "B" };

    Array.ForEach(values1, v1 => Array.ForEach(values2, v2 => Console.WriteLine(string.Concat(v1, v2))));

  5. var q = values1.SelectMany(v1 => values2.Select(v2 => string.Concat(v1, v2)));

  6. Simon says:

    Mais Mathieu, laisse moi répondre un peu ^^

    c’est bien :

    var q = values1.SelectMany(digit =>

       values2.Select(c => digit+c));

    (SelectMany transforme un IEnumerable<IEnumerable<T>> en IEnumerable<T>)

  7. seb.49 says:

    Comment lit on "en français" le code donné par Mathieu ?

    Merci, j’ai un peu de mal.

  8. Voici la réponse au précédent Quizz . Pour la version simple: var q = from v1 in values1 from v2 in values2

  9. tomlev says:

    Bon, j’arrive après la bagarre, mais voilà ma solution sans le "syntax sugar" 😉

    var q = values1.Join(values2, s => 1, s => 1, (s1, s2) => s1 + s2);

    (un peu brutal, certes…)