c# - 如何修复以下 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
解决方案
问题出在以下行:
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(在您的示例中为对象数组)
推荐阅读
- python - 安装正确版本的 Python 时出现问题
- git - VPN 下的 GIT 仅适用于热点,不适用于家庭路由器/wifi
- c++ - 带前导 1 的位移
- reactjs - React 钩子不使用异步等待设置对象状态。始终未定义
- notifications - 显示来自传入 webhook 的数据的问题 | 针叶林 --> Rocketchat
- javascript - 如何通过电子邮件发送屏幕截图?
- types - 如何为包含具有可变引用的函数签名的类型实现 PartialEq?
- python - 如何调用子类的类属性
- node.js - Discord.js ';' 预期的。x2
- python - 逐个循环浏览文件夹中的文件