C# 我可以将字符串的一维数组转换为Datacolumn的一维数组吗?
我使用linq查询对一列进行了分组,并从列中选择了一个值字符串数组。现在我想要的是将数组中的所有名称添加到我创建的新Datatable变量中。这是一个空白的数据表。所以我使用的是C# 我可以将字符串的一维数组转换为Datacolumn的一维数组吗?,c#,vb.net,linq,C#,Vb.net,Linq,我使用linq查询对一列进行了分组,并从列中选择了一个值字符串数组。现在我想要的是将数组中的所有名称添加到我创建的新Datatable变量中。这是一个空白的数据表。所以我使用的是Datatable.columns.addrange方法。此方法需要一个datacolumn数组。是否可以将字符串数组转换为datacolumn数组,并将字符串数组中的值作为列添加到空白数据表中? 感谢您抽出时间也许更容易/更容易阅读: foreach(string s in stringarray) datat
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)是的,我完全理解这种方法的缺点,我会对每一种方法都使用,但我仍然想学习它。谢谢你的帮助。你的目标是透视数据表吗?