首页 > 解决方案 > 使用 Select 的 DataTable 中的 Double(,) 而不是 Double()()

问题描述

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

对于初学者,我可以通过使用将 Age 和 Weight 列获取到锯齿状数组中

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

但是,上面的结果是一个锯齿状的,即 ()() 双数组,我无法将其输入到我的处理中——而且我不想编写循环来挑选 ()() 中的元素只是为了获取它们进入 (,)。

所以,如果我知道我有 1000 行和 20 列在 DataTable 中是双精度的(并且知道它们的名称),我怎么能直接使用 Select 创建一个 Double(20,1000) 数组或一个 Double(1000,20)和 ToArray?

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

标签: arraysvb.netlinqselectdatatable

解决方案


你正在寻找这样的东西:

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()()在创建输出之前添加过滤即可处理。


推荐阅读