如何修复下面的 LinQ 笛卡尔程序并使其正常工作?
How to fix the below LinQ Cartesian program and make it working?
我正在尝试让下面的程序运行以生成 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
问题出在以下行:
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 的 IEnumerable(我的示例中的对象数组列表),但您只是想传入三个单独的 IEnumerable(示例中的对象数组)
我正在尝试让下面的程序运行以生成 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
问题出在以下行:
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 的 IEnumerable(我的示例中的对象数组列表),但您只是想传入三个单独的 IEnumerable(示例中的对象数组)