Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以将字符串的一维数组转换为Datacolumn的一维数组吗?_C#_Vb.net_Linq - Fatal编程技术网

C# 我可以将字符串的一维数组转换为Datacolumn的一维数组吗?

C# 我可以将字符串的一维数组转换为Datacolumn的一维数组吗?,c#,vb.net,linq,C#,Vb.net,Linq,我使用linq查询对一列进行了分组,并从列中选择了一个值字符串数组。现在我想要的是将数组中的所有名称添加到我创建的新Datatable变量中。这是一个空白的数据表。所以我使用的是Datatable.columns.addrange方法。此方法需要一个datacolumn数组。是否可以将字符串数组转换为datacolumn数组,并将字符串数组中的值作为列添加到空白数据表中? 感谢您抽出时间也许更容易/更容易阅读: foreach(string s in stringarray) datat

我使用linq查询对一列进行了分组,并从列中选择了一个值字符串数组。现在我想要的是将数组中的所有名称添加到我创建的新Datatable变量中。这是一个空白的数据表。所以我使用的是
Datatable.columns.addrange
方法。此方法需要一个
datacolumn
数组。是否可以将字符串数组转换为datacolumn数组,并将字符串数组中的值作为列添加到空白数据表中?
感谢您抽出时间

也许更容易/更容易阅读:

foreach(string s in stringarray)
    datatable.Columns.Add(s);
但你可以试试:

datatable.Columns.AddRange(
  stringarray.Select(s=>new DataColumn(s)).ToArray()
);
后一种方法的问题是,它的书写时间较长,可读性较差,效率较低,因此有点损失。这两种方法的问题在于,除非您要检查名称并将任何以“Time”结尾的名称设置为datetime等,否则您无法指定列的类型

使用datatable a的最佳方法是将强类型数据集添加到项目中,并在设计时使用列类型、约束、关系、表达式等设计数据表本身

在vb.net中,它类似于:

DT2.Columns.AddRange(gg.Select(Function(r) new DataColumn(CStr(r("Plant")))).ToArray())
这比以下内容更令人讨厌:

For Each r as Thing in gg
  DT2.Columns.Add(CStr(r("Plant")))
因此,我们最终得出了您给我们带来的实际问题:您希望在Plant上分组,对另一列应用一些聚合,并希望对其进行透视,使您的行成为列。大概是这样的:

    'generate a datatable with dummy data
    Dim dt As New DataTable()
    dt.Columns.Add("Plant")
    dt.Columns.Add("SumMe")
    dt.Rows.Add("Rose", 1)
    dt.Rows.Add("Rose", 2)
    dt.Rows.Add("Tulip", 3)


    Dim groups = dt.AsEnumerable() _
                  .GroupBy(Function(r) New With {Key .Plant = CStr(r("Plant"))}) _
                  .Select(Function(grp) New With {Key grp.Key.Plant, .SumOf = grp.Sum(Function(ro) CInt(ro("SumMe")))})

    'for results
    Dim dt2 As New DataTable()
    dt2.Columns.Add("x")
    dt2.Rows.Add("x")

    For Each group In groups
        dt2.Columns.Add(group.Plant)
        dt2.Rows(0)(group.Plant) = group.SumOf
    Next group
我走了每一条路;如果您不顾一切地使用AddRange,尽管前面提到了丢失警告(这次会变得更加复杂,因为您必须将分组转换为数组并添加列,然后以某种形式对其进行访问以将值存储在结果dt中),我将把它留作练习:)


Datatable.Columns.AddRange
表示要添加多个列。您需要使用另一种方法来创建/添加单个列。检查
Datatable.Columns.Add
method添加列后,您需要添加行。hello@Caius感谢您的时间和良好的回答,但我收到一个错误,说明表达式不产生值这是代码我使用Select DT2.Columns.AddRange((gg.Select(Function(r)cstr(r(“Plant”))).toarray)。Select(Function(a)new datacolumn(a)).toarray)@Vickydas,在问题中显示您的代码,以及您遇到的错误类型,您将更快得到正确答案。从大小写混合以及括号使用缺乏严格性的情况来看,我假设您使用的是vb。我认为我写的代码没有被准确地转换;我只有1个选择,你有3个。尝试
DT2.Columns.AddRange(gg.Select(函数)newdatacolumn(CStr(r(“工厂”)))).ToArray())
。我可能漏掉了一个括号(但我一直说,这样做很难阅读和理解——现在已经有点被转换成vb的失败所证明了。认真推荐更简单的foreach方法抱歉@CaiusJard复制了不完整的代码,让你困惑。完整的代码是这样的,来自DT.AsEnumerable()中的roww通过x=New和{key.idd=roww.Item(“Col1”)、key.iddd=roww.Item(“Plant”)}分组到gg=Group-Select-DT2.Columns.AddRange((gg.Select(Function(r)cstr(r(“Plant”))).toarray)。Select(Function(a)New-datacolumn(a)).toarray)是的,我完全理解这种方法的缺点,我会对每一种方法都使用,但我仍然想学习它。谢谢你的帮助。你的目标是透视数据表吗?