首页 > 解决方案 > 如何修复以下 LinQ 笛卡尔程序并使其正常工作?

问题描述

我试图让下面的程序工作以生成 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

标签: c#compiler-errorscartesian-product

解决方案


问题出在以下行:

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);

您需要传入 IEnumerables 的 IEnumerable(在我的示例中为对象数组列表),但您只是试图传入三个单独的 IEnumerables(在您的示例中为对象数组


推荐阅读