2

我需要找到一个像这样工作的函数:

 int[] matches = getAllPossibleCombinations(
    int lengthOfEachIntReturnedInArray, 
    List<char> typesOfElementsUsedInCombinations);

输入元素将是这些(这只是一个示例):

  • int lengthofeachintreturnedinarray = (int) 2
  • List<char> typesofelementsusedincombinations = {a,b}

那么输出必须是(在字符串数组中):

抗体

bb

数组中的每个单独的输出元素必须具有由方法中的第一个参数定义的长度(在本例中为 2),并且必须包含第二个参数中给定字母之间的所有可能组合

我看过一些关于 powerset 的东西,我应该使用它们,还是foreach循环适合这项工作?

!与上面答案的建议问题不一样,它不使用设置长度!

4

1 回答 1

2

我将带您阅读 Eric Lippert关于在 Linq中实现笛卡尔积的文章,他将其作为扩展方法编写。

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));
}
于 2013-09-05T16:32:39.860 回答