我需要找到一个像这样工作的函数:
int[] matches = getAllPossibleCombinations(
int lengthOfEachIntReturnedInArray,
List<char> typesOfElementsUsedInCombinations);
输入元素就是这些(这只是一个例子):
int lengthofeachintreturnedinarray = (int) 2
List<char> typesofelementsusedincombinations = {a,b}
然后输出必须是(在字符串数组中):
AA
AB
BA
BB
数组中的每个单独的输出元素必须具有由方法中的第一个参数定义的长度(在本例中为2),并且必须包含第二个参数中给定字母之间的所有可能组合
我看过一些关于powersets的内容,我应该使用它们,还是应该foreach
循环适合这项工作?
!上面回答的建议问题是不一样的,它不使用设置长度!
答案 0 :(得分:2)
我会指导你到Eric Lippert的article在Linq中实现Cartesian Product,他写的是extension method。
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 accseq in accumulator
from item in sequence
select accseq.Concat(new[] {item}));
}
使用此方法,您可以像这样实现您的方法:
static IEnumerable<string> GetAllPossibleCombinations(
int lengthofeachintreturnedinarray,
IEnumerable<string> typesofelementsusedincombinations)
{
return Enumerable
.Repeat(typesofelementsusedincombinations, lengthofeachintreturnedinarray)
.CartesianProduct()
.Select(strings => String.Concat(strings));
}