LINQ słowa binarne o długości k - dynamiczność

0

Witam,
w swoim programie korzystam ze wszystkich możliwych k-elementowych wariacji z powtórzeniami ze zbioru {0, 1}. Innymi słowami - wszystkie możliwe słowa binarne o długości k.
Np. dla k = 6 wyznaczam je za pomocą tego kodu:

var informationWords =
    from b1 in new int[] { 0, 1 }
    from b2 in new int[] { 0, 1 }
    from b3 in new int[] { 0, 1 }
    from b4 in new int[] { 0, 1 }
    from b5 in new int[] { 0, 1 }
    from b6 in new int[] { 0, 1 }
    select new int[] { b1, b2, b3, b4, b5, b6 };

Dla innych k muszę ręcznie dodawać lub odejmować klauzule from i elementy w tablicy pod select. Zależy mi na tym, żeby robić to dynamicznie, w zależności od k. Czy jest taka możliwość? Znalazłem bibliotekę Dynamic Linq Library, ale z tego co widzę, to pozwala ona tylko na modyfikację klauzul select i where (chyba że się mylę). Wygląda na to, że pozwoliłaby mi rozwiązać problem z select, ale dalej zostaje from. Czytałem także o Expression Trees, ale niezbyt wiem jak tego tutaj użyć i czy w ogóle się da.

Próbowałem podejść także do tego od nieco innej strony - najpierw wygenerować listę k zero-jedynkowych tablic, a następnie uzyskać taki efekt jak wyżej, ale niestety nie udało się. Proszę o jakąś podpowiedź. :)

2

Przekombinowujesz.

Weź zwykłego inta, dla k<32 (większy zakres masz w uint, long, ulong), inkrementuj go od począwszy od zera, i wyciągaj poszczególne bity operacjami bitowymi.

1

Tak jak napisał @Azarien. Ale jeśli ma być koniecznie LINQ:

using System;
using System.Linq;

namespace ConsoleApplication2
{
    internal class Program
    {
        public static string[] BinaryPermutation(int length)
        {
            if (length == 1) return new string[2] { "0", "1" };
            else
            {
                var result = from b1 in BinaryPermutation(length - 1)
                             from b2 in new string[2] { "0", "1" }
                             select b1 + b2;

                return result.ToArray();
            }
        }

        private static void Main(string[] args)
        {
            var permutation = BinaryPermutation(3);
            foreach (var p in permutation) Console.WriteLine(p);

            Console.ReadKey();
        }
    }
}
0

Dzięki, o coś takiego mi właśnie chodziło. Zależało mi na tym, żeby to było jednak w LINQ, co nie zmienia faktu, że szukałem rozwiązania trochę okrężną drogą, podczas gdy można to elegancko zrobić rekurencyjnie. Pozdrawiam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1