gpt4 book ai didi

c# - 如何将 DataTable 列的全部内容转换为 C# 中的分隔字符串?

转载 作者:太空狗 更新时间:2023-10-29 22:34:18 27 4
gpt4 key购买 nike

我正在使用 SqlDataAdapter 和 DataSet 从 MSSQL 服务器检索数据。从那个数据集中,我正在创建一个数据表。我的目标是将表的每一列转换为一个字符串,其中元素以逗号分隔。我想我会先尝试字符串转换,然后再使分隔符起作用。

代码在 ASP.Net 页面的代码隐藏中运行。最终目标是将字符串传递给 jscript 变量,这是一个“功能要求”,我从列中创建一个带分隔符的字符串,并且它必须以 jscript 变量结束。

这是我目前所拥有的:

    DataSet myDataSet = new DataSet();
mySqlDataAdapter.Fill(myDataSet);
DataTable temperature = myDataSet.Tables["Table"];

// LOOP1
foreach (DataRow row in temperature.Rows)
// this loop works fine and outputs all elements
// of the table to the web page, this is just to
// test things out
{
foreach (DataColumn col in temperature.Columns)
{
Response.Write(row[col] + " ### ");
}
Response.Write("<br>");
}

// LOOP2
foreach (DataColumn column in temperature.Columns)
// this loop was meant to take all elements for each
// column and create a string, then output that string
{
Response.Write(column.ToString() + "<br>");
}

在 LOOP1 中一切正常。我的数据有 4 列,所有列都在网页上以每行一条记录的形式适当呈现。

我在 http://msdn.microsoft.com/en-us/library/system.data.datacolumn.tostring.aspx 看到了 LOOP2 的代码这似乎完全符合我的需要,只是它实际上并没有按照我的意愿行事。

LOOP2 唯一做的就是向网页写入 4 行。每行都有相应表格列的标题,但没有其他数据。很明显,要么我有逻辑缺陷,要么我误解了 DataColumn 和 .toString 的工作原理。请帮我解决这个问题。提前致谢。

编辑:这是一个 SQL 查询结果示例,这是表的样子: Table quesry result @ ImageShack

我最终想要的是四个字符串,这里是从第二列创建的字符串的示例:“-6.7、-7、-7.2、-7.3、-7.3”。

最佳答案

此代码将使用 ", ":

连接每列下单元格的值
foreach (var column in temperature.Columns)
{
DataColumn dc = column as DataColumn;
string s = string.Join(", ", temperature.Rows.OfType<DataRow>()
.Select(r => r[dc]));
// do whatever you need with s now
}

例如,对于DataTable定义为:

DataTable table = new DataTable();
table.Columns.Add(new DataColumn("Column #1"));
table.Columns.Add(new DataColumn("Column #2"));
table.Rows.Add(1, 2);
table.Rows.Add(11, 22);
table.Rows.Add(111, 222);

... 它将生成 "1, 11, 111""2, 22, 222" 字符串。


编辑: 我看到您选择将列声明为 var 而不是 DataColumn,这是个人偏好/风格的问题还是编码有问题?

考虑以下场景(在与上述相同的数据表示例中):

// we decide we'll use results later, storing them temporarily here
List<IEnumerable<string>> columnsValues = new List<IEnumerable<string>>();
foreach (DataColumn column in temperature.Columns)
{
var values = temperature.Rows.OfType<DataRow>()
.Select(r => r[column].ToString())
columnsValues.Add(values);
}

我们假设我们现在得到了列值列表。所以,当我们打印它们时,像这样:

foreach (var lisOfValues in columnsValues)
{
foreach (var value in listOfValues)
{
Debug.Write(value + " ");
}

Debug.WriteLine("");
}

我们希望看到 1 11 111,然后是 2 22 222。正确的?

错误

此代码将输出 2 22 222 两次。为什么?我们的 .Select(r => r[column].ToString()) captures column 变量 - 而不是它的值,而是变量本身 - 因为我们不立即使用它,所以一旦我们跳出循环,我们所知道的就是 columnlast 值。

要了解有关此概念的更多信息,请搜索闭包捕获的变量 - 例如,在类似 this 的帖子中.

总结:

在这种情况下,您可以在 foreach 语句中使用 DataColumn。这在这里无关紧要,因为我们在循环内通过 .Select(r => r[dc]) 进行枚举(准确地说,string.Join 确实这对我们来说),在我们进行下一次迭代之前产生结果 - 无论我们捕获什么,都会立即使用。

关于c# - 如何将 DataTable 列的全部内容转换为 C# 中的分隔字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5749874/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com