Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何迭代任意数量的列表,包括每个排列?_C#_Iteration - Fatal编程技术网

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

C# 如何迭代任意数量的列表,包括每个排列?,c#,iteration,C#,Iteration,例如,如果我有两个列表,我会: foreach (Item item1 in lists[0]) foreach (Item item2 in lists[1]) // Do something with item1 and item2 或者如果我有三个,我会的 foreach (Item item1 in lists[0]) foreach (Item item2 in lists[1]) foreach (Item item3 in lists[2])

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

foreach (Item item1 in lists[0])
  foreach (Item item2 in lists[1])
    // Do something with item1 and item2
或者如果我有三个,我会的

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
但是如果我在编译时不知道列表集合中有多少个列表,我怎么能轻松地迭代每个排列

C语言的解决方案是理想的,但任何语言的解决方案都可以证明合适的算法

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

for (int i = 0; i < lists.Length; i++) {
    foreach (Item item in lists[i]) {
       ....
    }
}
如果你的列表中有一个是空的,它会毁掉整件事,但你应该能够解决这个问题……

埃里克·利珀特(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})); 
}

是否有多个独立的列表或它们是否以某种方式连接?他们是否有父母/子女关系?兄弟姐妹?他们是嵌套的。这只有在我按顺序迭代的情况下才能起作用。将电子表格中的列列表和行列表想象为一个二维示例,在这个示例中,我需要对每个单元格进行处理。不幸的是,我需要一个n维的解决方案。用一个更具体的方法来提供答案会更容易。对项目1和项目2做点什么。根据你想对值做什么,你总是可以编写一个递归方法。这将只涵盖他显式调用的二维情况。他想为任何n维列表集找到一个更一般的解决方案。@Servy-你有证据/解释这个说法吗?我在找关于这个主题的文章。同时,您需要将if index==lists.Count更改为使用Count-1,否则只会得到索引越界错误。。请注意,这是一个由3部分组成的系列;这只是第一部分。@Servy-这里提到的问题是递归迭代,而不是递归迭代器块。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})); 
}