【问题标题】:How can I create a cross-product object with names from a list?如何使用列表中的名称创建交叉产品对象?
【发布时间】:2017-12-18 19:26:02
【问题描述】:

我有一些 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

【问题讨论】:

  • 您确定不应该使用Dictionary(Of TKey, TValue) 而不是键/值对列表吗?
  • 将其重写为字典很容易,但我不确定字典如何更容易获得值的叉积。
  • 也许 那个 部分并不容易,但更好的是 tgat 字典提供基于哈希的查找(注意:不允许重复),这使得在某些情况下访问项目更快知道密钥的地方。前任。如果您要获取名称为 Column 1 的项目,您只需要一行:myDictionary("Column 1") 而对于您的列表,您必须迭代它直到找到名称。
  • 虽然这完全取决于您和您的需求。我只是觉得使用列表几乎复制字典的行为有点奇怪。尽管该列表提供了您的情况可能需要的基于索引的查找。 ——嗯,我知道什么?祝你的项目好运! :)
  • 是的,我搞砸了几种方法,包括使用索引,只是将那部分用作可视化示例来描述我的主要目标的先决条件。我可以看到您的评论对不熟悉 Dictionary 对象的人有何帮助。

标签: .net vb.net list datatable cartesian-product


【解决方案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列以上的笛卡尔积,这里有一篇Eric Lippert关于这个主题的文章(C#):Computing a Cartesian product with LINQ

我正在使用Anonymous TypeCollection InitializersLINQ

【讨论】:

  • 感谢您的链接。是的,我需要一个像他提到的那样的解决方案,其中列数在编译时是未知的。
  • 此外,该解决方案实际上与我尝试的方案相距不远,但语法却让我望而却步。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-22
  • 2013-04-19
  • 1970-01-01
  • 2020-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多