【发布时间】:2018-11-10 22:19:58
【问题描述】:
我需要一种算法,它可以在 List 中获取任意数量的 List 并生成一组唯一的排列。我更喜欢寻找 LINQ 解决方案。
我实际上有一个运行良好的 Javascript 函数,我正在尝试用 C# 重新创建它(参见底部的代码)
C#(我的尝试)- Visual Studio 不喜欢我的第二个 Aggregate()。它说the arguments cannot be inferred from usage
public static void testit()
{
List<List<string>> master = new List<List<string>>();
List<string> voltages = new string[] { "208", "230", "460" }.ToList();
List<string> sysConfigs = new string[] { "10205", "10210", "10215", "10220" }.ToList();
master.Add(voltages);
master.Add(sysConfigs);
var amp = master.Aggregate(
(a, b) => a.Aggregate(
(r, v) => r.Concat(
b.Select(w => new List<string>().Concat(v, w))
), new List<string>()
)
);
}
这个新集合的输出应该是这样的:
/*
OUTPUT (displayed as arrays - but will be lists):
[
["208", "10205"],
["208", "10210"],
["208", "10215"],
["208", "10220"],
["230", "10205"],
["230", "10210"],
["230", "10215"],
["230", "10220"],
["460", "10205"],
["460", "10210"],
["460", "10215"],
["460", "10220"]
];
这是一个运行良好的 Javascript 函数,我试图在 C# 中模仿它:
function getPermutations(arr) {
return arr.reduce(
(a, b) => a.reduce((r, v) => r.concat(b.map(w => [].concat(v, w))), [])
);
}
var voltages = ["208", "230", "460"];
var sysConfigs = ["10205", "10210", "10215", "10220"];
var master = [];
master.push(voltages);
master.push(sysConfigs);
var newArr = getPermutations(master);
console.log(newArr);
【问题讨论】:
-
类型推断不能在返回类型上发生,这是你最外面的
Aggregate需要从最里面的Aggregate知道的。您可能必须明确键入您的 lambda。 -
您将两个参数传递给内部
Aggregate- 一个 lambda 和一个List<string>。这与任何signature ofAggregate都不匹配。您不能真正从一种语言中获取函数名称和签名,并期望它们以相同的含义和顺序存在于另一种语言中。 -
@GSerg 我理解语言不能混用 - 显示 Javascript 函数的目的纯粹是为了方法。但是您关于 Aggregate 签名的观点似乎暗示这是无法做到的。如果是这样,是否有可能工作的递归函数?
-
不,我的意思是您需要按照 C# 签名所期望的顺序传递参数。
-
@Chris 感谢您的支持; ericlippert.com/2010/06/28/… 是一个更好的链接。
标签: c# arrays permutation