【问题标题】:Double(,) and not Double()() from DataTable Using Select使用 Select 的 DataTable 中的 Double(,) 而不是 Double()()
【发布时间】:2021-06-01 04:51:24
【问题描述】:

我有一个包含 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 中是双精度的(并且知道它们的名称),我如何创建一个 Double(20,1000) 数组或一个 Double(1000,20)直接使用 Select 和 ToArray?

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

【问题讨论】:

  • 二维数组没有 LINQ 运算符,因此您需要使用两个嵌套的 For Each 并构建二维数组。你知道该怎么做吗?
  • 你能改变你的“处理”,让它接受锯齿状数组吗?

标签: arrays vb.net linq select datatable


【解决方案1】:

你正在寻找这样的东西:

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()() 即可解决。

【讨论】:

  • 过滤:例如.AsEnumerable().Where(Function(x) DirectCast(x("Age"), Double) > 40)) 或者可能使用数据表选择方法(dt.Select("[Age] > 40")
  • @Enigmativity - 谢谢,因为您的语法会迅速推动我转储到二维数组中。
  • 作为一个小修复,我将Dim output(arrayOfDoubles.Length, arrayOfDoubles.First().Length) As Double 更改为Dim output(arrayOfDoubles.Length - 1, arrayOfDoubles.First().Length - 1) As Double
猜你喜欢
  • 2013-07-10
  • 1970-01-01
  • 1970-01-01
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多