C# 列表上的笛卡尔乘积

C# 列表上的笛卡尔乘积,c#,C#,由于编译错误,我正在努力创建列表的笛卡尔乘积 如果输入是IEnumerable,extension方法起作用,但如果是list,则会遇到困难 返回类型必须是列表 下面的代码在序列 public static List<List<T>> CartesianProduct<T>(this List<List<T>> sequences, Func<T, T> aggregateFunct) { List<List&

由于编译错误,我正在努力创建列表的笛卡尔乘积

如果输入是IEnumerable,extension方法起作用,但如果是list,则会遇到困难

返回类型必须是列表

下面的代码在
序列

public static List<List<T>> CartesianProduct<T>(this List<List<T>> sequences, Func<T, T> aggregateFunct)
{
    List<List<T>> emptyProduct = new List<List<T>> { new List<T>() };
    return sequences.Aggregate(
      emptyProduct,
      (accumulator, sequence) =>
        from accseq in accumulator
        from item in sequence // CS1943
        select accseq.AddRange(new List<T> { aggregateFunct(item) }));
}
公共静态列表CartesianProduct(此列表序列,Func aggregateFunct)
{
List emptyProduct=新列表{new List()};
返回序列.聚合(
空产品,
(累加器,顺序)=>
来自蓄能器中的accseq
按顺序从项目//CS1943
选择accseq.AddRange(新列表{aggregateFunct(item)}));
}
任何帮助都将不胜感激

严重性代码描述项目文件行抑制状态
错误CS1943源类型为“List”的查询表达式的后续from子句中不允许使用“List”类型的表达式。调用“SelectMany”时类型推断失败。数学…\math.cs 17活动

我不明白您为什么要更改该方法。它可以用于任何
IEnumerable
,而不仅仅是
列表
。 如果需要列表列表,只需调用
.ToList()
,即可获得结果:

...CartesianProduct().Select(x => x.ToList()).ToList();
并保持原始方法不变:

public static IEnumerable<IEnumerable<T>> CartesianProduct<T>(this IEnumerable<IEnumerable<T>> sequences)
{
    IEnumerable<IEnumerable<T>> emptyProduct = new[] { Enumerable.Empty<T>() };
    return sequences.Aggregate(emptyProduct,
        (accumulator, sequence) =>
            from acc in accumulator
            from item in sequence
            select acc.Concat(new[] { item }));
}
公共静态IEnumerable CartesianProduct(此IEnumerable序列)
{
IEnumerable emptyProduct=new[]{Enumerable.Empty()};
返回序列。聚合(emptyProduct,
(累加器,顺序)=>
来自蓄能器中的acc
按顺序从项目开始
选择acc.Concat(新[]{item}));
}

问题是
AddRange
返回
void
,因此您的
select
语句无效。您可以创建和扩展类似于
AddRange
的方法,但返回值和更新代码如下

private static List<T> AddRangeReturn<T>(this List<T> list, IEnumerable<T> items)
{
    list.AddRange(items);

    return list;
}

public static List<List<T>> CartesianProduct<T>(List<List<T>> sequences, Func<T, T> aggregateFunct)
{
    List<List<T>> emptyProduct = new List<List<T>> { new List<T>() };
    return sequences.Aggregate(
        emptyProduct,
        (accumulator, sequence) =>
            (from accseq in accumulator
            from item in sequence // CS1943
            select accseq.AddRangeReturn(new List<T> { aggregateFunct(item) })).ToList());
}
private static List AddRangeReturn(此列表,IEnumerable项)
{
列表。添加范围(项目);
退货清单;
}
公共静态列表CartesianProduct(列表序列、函数聚合函数)
{
List emptyProduct=新列表{new List()};
返回序列.聚合(
空产品,
(累加器,顺序)=>
(来自蓄能器中的accseq)
按顺序从项目//CS1943
选择accseq.AddRangeReturn(新列表{aggregateFunct(item)})).ToList();
}

A side note,method
.AddRange
返回
void
,因此您不太可能对其使用
select