你如何迭代任意数量的列表,包括每个列表?

Fly*_*179 6 c# iteration

例如,如果我有两个列表,我会这样做:

foreach (Item item1 in lists[0])
  foreach (Item item2 in lists[1])
    // Do something with item1 and item2
Run Code Online (Sandbox Code Playgroud)

或者,如果我有三个,我会这样做

foreach (Item item1 in lists[0])
  foreach (Item item2 in lists[1])
    foreach (Item item3 in lists[2])
      // Do something with item1, item2, and item3
Run Code Online (Sandbox Code Playgroud)

但如果我在编译时不知道lists集合中有多少列表,我怎样才能轻松迭代每个排列?

AC#解决方案是理想的,但是任何演示合适算法的语言的解决方案都很方便.

一个好的二维示例是电子表格中的列列表和行列表,我需要在每个单元格上进行处理.然而,这是一个n维问题.

Ser*_*rvy 5

埃里克·利珀特(Eric Lippert)有一篇关于该主题的精彩文章

强烈建议阅读该文章,因为它描述了获得结果的过程,但是最后结果代码简短而有趣:

(从链接复制的逐字记录)

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})); 
}
Run Code Online (Sandbox Code Playgroud)