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}));
}