使用 Select 来自 DataTable 的 Double(,) 而不是 Double()()

Double(,) and not Double()() from DataTable Using Select

我有一个包含 Double 或 String(字符)字段的数据表。使用 Select 和 ToArray 方法,如何将我知道是双精度的列提取到多维双精度数组中?

首先,我可以使用

将年龄和体重列提取到锯齿状数组中
Dim arrayOfDoubles()() As Double = dt.AsEnumerable().Select(Function(x) {Convert.ToDouble(x("Age")), Convert.ToDouble(x("Weight"))}).ToArray()

但是,上面的结果导致锯齿状,即 ()() 双数组,我无法将其输入到我的处理中——而且我不想编写循环来提取 ()( ) 只是为了让他们进入 (,)。

所以,如果我知道 DataTable 中有 1000 行和 20 列(并且知道它们的名称),我该如何创建 Double(20,1000) 数组或 Double(1000, 20) 直接使用 Select 和 ToArray?

此外,如果我想过滤 age>40,并获取相同的 20 列,但结果只有 300 行,该怎么办?如何从该过滤中创建 Double(20,300) 数组或 Double(300,20)?

您正在寻找这样的东西:

Dim arrayOfDoubles()() As Double = _
        dt.AsEnumerable() _
            .Select(Function(x) _
            { _
                Convert.ToDouble(x("Age")), _
                Convert.ToDouble(x("Weight")) _
            }) _
            .ToArray()
            
Dim output(arrayOfDoubles.Length, arrayOfDoubles.First().Length) As Double

For i = 0 To arrayOfDoubles.Length - 1
    For j = 0 To arrayOfDoubles.First().Length - 1
        output(i, j) = arrayOfDoubles(i)(j)
    Next
Next 

对于您的过滤问题,只需在创建输出之前将过滤添加到 arrayOfDoubles()() 即可解决。