Как я могу создать объект из нескольких продуктов с именами из списка?

У меня есть в памяти представление списка некоторых n столбцов данных

Dim l As New List(Of KeyValuePair(Of String, List(Of Double)))

Например

Column 1: {1, 2, 3, 4, 5}
Column 2: {-0.05, 0, 450.7}
etc.

Мне нужно перекрестное соединение, взять декартово произведение или любую номенклатуру, которую вы предпочитаете, весь список, сохранить имена и сохранить результат в объекте. Результат будет выглядеть как

 Col 1   Col 2
 1       -0.05
 1        0
 1        450.7
 2       -0.05
 2        0
 2        450.7
 3       -0.05
(etc.)

Как это может быть сделано?

Обновить:

Ниже ответ работает в C#. Для потомков вот VB.Net эквивалент (должное автору)

    Private Function CartesianProduct(Of T)(sequences As IEnumerable(Of IEnumerable(Of T))) As IEnumerable(Of IEnumerable(Of T))
        Dim result As IEnumerable(Of IEnumerable(Of T)) = {Enumerable.Empty(Of T)}
        For Each sequence In sequences
            Dim s = sequence
            result = From seq In result
                     From item In s
                     Select seq.Concat({item})
        Next
        Return result
    End Function

1 ответ

Решение

Вы можете использовать LINQ

Dim c1 = New List(Of Integer) From {1, 2, 3, 4, 5}
Dim c2 = New List(Of Double) From {-0.05, 0, 450.7}
Dim product = From first In c1 From second In c2 Select New With {first, second}

For Each x In product
    Console.WriteLine(x)
Next
Console.ReadKey()

Если вам нужно получить декартово произведение из более чем 2 столбцов, вот статья Эрика Липперта на эту тему (C#): Вычисление декартового произведения с помощью LINQ

Я использую анонимный тип, коллекционные инициализаторы и LINQ.

Другие вопросы по тегам