Как исправить приведенную ниже программу LinQ Cartesian и заставить ее работать? - PullRequest
1 голос
/ 01 ноября 2019

Я пытаюсь запустить приведенную ниже программу, чтобы получить декартово произведение n списков. Однако я не могу скомпилировать его успешно.

namespace CombiGenerator
{
    static class AppendExtension
    {
        public static IEnumerable<T> Append<T>(this IEnumerable<T> that, T item)
        {
            IEnumerable<T> itemAsSequence = new T[] { item };
            return that.Concat(itemAsSequence);
        }
    }


    public static class Program
    {

        public static void Main(string[] args)
        {

            object[] letters = { 'A', 'B', 'C' };
            object[] numbers = { 1, 2, 3, 4 };
            object[] colours = { "Red", "Blue" };

            var cartesianProduct = CartesianProduct(letters, numbers, colours);
            foreach (var item in cartesianProduct)
            {
                Console.WriteLine(string.Join(",", item));
            }
        }

        public static IEnumerable<IEnumerable<T>> CartesianProduct<T>(IEnumerable<IEnumerable<T>> inputs)
        {
            return inputs.Aggregate(
                EnumerableFrom(Enumerable.Empty<T>()),
                (soFar, input) =>
                    from prevProductItem in soFar
                    from item in input
                    select prevProductItem.Append(item));
        }

        private static IEnumerable<T> EnumerableFrom<T>(T item)
        {
            yield return item;
        }
    }
}

Я получаю сообщение об ошибке ниже.

Error   1   No overload for method 'CartesianProduct' takes 3 arguments  
c:\users\hp 15\documents\visual studio  2013\Projects\CombiGenerator\CombiGenerator\Program.cs  30  36  CombiGenerator

1 Ответ

1 голос
/ 01 ноября 2019

Проблема в следующей строке:

var cartesianProduct = CartesianProduct(letters, numbers, colours);

буквы, цифры и цвета должны быть вставлены в IEnumerable и затем переданы в CartesianProduct.

Примечание: по умолчанию яСписки примеров при написании нового кода:

object[] letters = { 'A', 'B', 'C' };
object[] numbers = { 1, 2, 3, 4 };
object[] colours = { "Red", "Blue" };

List<object[]> cartesianProducts = new List<object[]> { letters, numbers, colours };
var cartesianProduct = CartesianProduct(cartesianProducts);

Вам нужно передать IEnumerable из IEnumerables ( Список массивов объектов в моем примере ), но вы просто пытаетесь передать втри отдельных IEnumerables ( Массивы объектов в вашем примере )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...