【发布时间】: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