The helper class provided by Nathan Brixius
使SetBinding方式更容易。他的助手类是用C#编写的,所以我继续将您需要的特定助手函数转换为VB(见下文)。
例外情况是告诉您
SetBinding
函数需要知道传入数据的索引。MSF是为处理泛型域而构建的,这意味着它不遵守正常的数组索引。您必须明确指出索引信息。
代码的问题在于,您试图在没有任何额外索引数据的情况下传入原始数组。要在普通1D数组上解决此问题,可以使用添加索引
KeyValuePair(Of Integer, Double)
.在这种情况下,对于矩阵,您需要一个列表
Tuple (index1, index2, Double)
。本质上,您需要将3x3矩阵展平为9个三元组,根据一对索引指定每个值。
以下是VB函数,用于将矩阵转换为列表:
Private Function ToIEnumerable(Of T)(matrix As IEnumerable(Of IEnumerable(Of T))) As IEnumerable(Of Tuple(Of Integer, Integer, T))
Dim m = matrix.[Select](Function(row, i) row.[Select](Function(cell, j) New Tuple(Of Integer, Integer, T)(i, j, cell)))
Dim cells = From cell In m.SelectMany(Function(c) c)
Return cells
End Function
在类中包含此函数,然后更改代码的SetBinding行,如下所示:
m_cov.SetBinding(ToIEnumerable(CovMatrix), "Item3", "Item1", "Item2")
请注意
Tuple
项目!根据MSF惯例,值字段位于索引之前。在解决方案输出中返回相同的顺序(当您希望对结果集上的Decisions进行迭代时,需要注意的一点很重要)。
如果您转换Nathan的助手类的其余部分,他会通过重载SetBinding函数本身来抽象掉
ToIEnumerable(data)
调用以及键/值标识符排序。然后你可以简单地打电话
model.SetBinding(rawMatrix)
。
相当圆滑,是吗?)