簡體   English   中英

如何將DataTable列的整個內容轉換為C#中的分隔字符串?

[英]how to convert the entire content of a DataTable column to a delimited string in C#?

我正在使用SqlDataAdapter和DataSet從MSSQL服務器檢索數據。 從那個DataSet我創建了一個DataTable。 我的目標是將表的每一列轉換為字符串,其中元素以逗號分隔。 我想我會在分隔符工作之前先嘗試字符串轉換。

代碼在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查詢結果示例,這就是表的樣子: 表格問題結果@ 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()) 捕獲 column變量 - 不是它的值,而是變量本身 - 因為我們不立即使用它,一旦我們離開循環,我們所知道的是最后一個 column值。

要了解有關此概念的更多信息,請搜索閉包捕獲的變量 - 例如,在此類帖子中。

摘要

在這種情況下,您可以在foreach語句中使用DataColumn 這沒關系,因為我們在循環內部通過我們的.Select(r => r[dc])進行枚舉(確切地說, string.Join為我們做了這一點),在我們進入下一次迭代之前產生結果 -無論我們捕獲什么,都會立即使用。

您發布的鏈接清楚地說明了

如果設置了屬性,則為Expression值; 否則,ColumnName屬性。

這就是正在發生的事情。 你得到列名。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM