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