2014-10-07 2 views
2

У меня динамический список (SuperList) с N элементов, например, здесь с тремя пунктами А, В и С:Комбинации в список (из списка (Объекта))

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 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

Возможный дубликат [Как «закрепить» или «повернуть» переменное количество списков?] (Http://stackoverflow.com/questions/17976823/how-to-zip-or-rotate-a-variable- number-of-lists) –

ответ

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 «structure». Я знаю ваше решение, но это можно использовать только в том случае, если я знаю количество элементов в SuperList. Но мне нужно решение для неизвестного динамического количества элементов. – milos

+0

О, хорошо, я неправильно понял динамику, что количество элементов в 'A',' B' и 'C' может меняться. Я попытаюсь что-то придумать. – Vache

Смежные вопросы