2014-10-07 67 views
2

((的对象)列出的)我有一个动态列表(SuperList)与N个项目,例如在这里与三个项目A,B和C:组合在列表

Dim A As New List(Of String) 
A.Add("Aa") 
A.Add("Bb") 
A.Add("Cc") 

Dim B As New List(Of String) 
B.Add("Small") 
B.Add("Large") 

Dim C As New List(Of Integer) 
C.Add(1) 
C.Add(2) 

Dim SuperList As New List(Of Object) 
SuperList.Add(A) 
SuperList.Add(B) 
SuperList.Add(C) 
... 

我需要从生成SuperList另一个List(Of List(Of String)):

Aa – Small – 1 
Aa – Small – 2 
Aa – Large – 1 
Aa – Large – 2 
Bb – Small – 1 
Bb – Small – 2 
Bb – Large – 1 
Bb – Large – 2 
Cc – Small – 1 
Cc – Small – 2 
Cc – Large – 1 
Cc – Large – 2 

SuperList中的项数是动态的。怎么做?

+0

[如何“zip”或“旋转”可变数量的列表?](http://stackoverflow.com/questions/17976823/how-to-zip-or-rotate-a-variable-列表数) – 2014-10-07 21:46:19

回答

4

你基本上试图计算可变数量列表的笛卡尔乘积。

MSDN article讨论的话题,并配备了下面的函数(C#代码)

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

你会呼吁SuperList该功能。我坏在VB.NET,所以我通过automated converter

<System.Runtime.CompilerServices.Extension> _ 
Private Shared Function CartesianProduct(Of T)(sequences As IEnumerable(Of IEnumerable(Of T))) As IEnumerable(Of IEnumerable(Of T)) 
    Dim emptyProduct As IEnumerable(Of IEnumerable(Of T)) = New() {Enumerable.Empty(Of T)()} 
    Return sequences.Aggregate(emptyProduct, Function(accumulator, sequence) From accseq In accumulatorFrom item In sequenceaccseq.Concat(New() {item})) 
End Function 

跑的功能,请纠正我,如果这个“翻译”是错误的。

+0

是的,我需要使用SuperList“结构”。我知道你的解决方案,但只有当我已经知道SuperList中的项目数量时才可用。但我需要解决未知的动态数量的项目。 – milos 2014-10-07 21:30:32

+0

噢好吧,我动态地误解了'A','B'和'C'中的项目数量可能会有所不同。我会试着想一些事情。 – Vache 2014-10-07 21:31:58