Я хочу преобразовать один столбец моей таблицы данных в список строк с помощью C #. Я пробовал 4 других решения, которые я нашел в stackoverflow, некоторые с использованием LINQ, а другие с использованием циклов foreach. Ни один из них пока не работал, поэтому я запутался. Я включу свой код с данными. Одно из неудачных решений закомментировано в коде.

C #:

    private DataTable GetData(SqlCommand cmd)
    {
        DataTable dt = new DataTable();
        SqlConnection conn = new SqlConnection(strConnString);
            SqlDataAdapter adapter = new SqlDataAdapter();
            cmd.CommandType = CommandType.Text;
            cmd.Connection = conn;
            adapter.SelectCommand = cmd;
            adapter.Fill(dt);
//failed solution 1
           // var list = dt.Rows.OfType<DataRow>()
           //.Select(dr => dr.Field<string>("CraftType")).ToList();

//failed solution 2
/* List<string> s = dt.AsEnumerable().Select(x => x[6].ToString()).ToList();

             foreach (string e in s)
            {
                Console.WriteLine(e);

                Console.ReadLine();
            }*/

            return dt;
    }
0
user3267755 9 Авг 2014 в 03:46

3 ответа

Лучший ответ

Я использовал часть кода @RobertHarvey. У них было слишком много петель, а Console.Write не писал на моей странице. Этот фрагмент кода взял указанный мной столбец и записал его в виде списка на мою страницу.

private void PrintTable(DataTable table)
{
    foreach (DataRow row in table.Rows)
    {
        Response.Write(row[column] + "<br />");
    }
}
0
user3267755 9 Авг 2014 в 04:09

Итерируйте Columns коллекция. Пример:

private void PrintTable(DataTable table)
{
    foreach(DataRow row in table.Rows)
    {
        PrintRow(table, row);
    }
}

private void PrintRow(DataTable table, DataRow row)
{
    foreach(DataColumn column in table.Columns)
    {
        Console.Write(row[column] + " ");
    }
}
2
Robert Harvey 9 Авг 2014 в 04:01
Код будет Console.Write(row[column] + " ");, но он по-прежнему ничего не записывает, хотя у меня есть данные в моем столбце.
 – 
user3267755
9 Авг 2014 в 03:59
Тогда вам нужно дать понять, что это проблема, которая у вас возникла ... Нет данных.
 – 
Robert Harvey
9 Авг 2014 в 04:01
Я сказал, что у меня есть данные в моем столбце. Я изменил ваш код на Response.Write с Console.Write, и теперь он отображает данные, но ваши циклы выполняются слишком много раз.
 – 
user3267755
9 Авг 2014 в 04:05

Поскольку обе ваши попытки были в LINQ, вот решение с использованием LINQ:

var strings = dt.Rows.Cast<DataRow>().Select(row => row["(columnname)"].ToString());

Я предполагаю, что вам нужны строки, вызывая .ToString() для значений row [col]. Здесь также нет проверки ошибок (например, наличие проверки col / DBNull)

Чтобы было удобнее, я бы превратил его в метод расширения:

public static class DataTableExtensions
{
    public static IEnumerable<string> GetDataInColumn(this DataColumn column)
    {
        return column.Table.Rows.Cast<DataRow>().Select(row => row[column.ColumnName].ToString());
    }
}

Тогда вы можете сделать это:

class Program
{
    static void Main(string[] args)
    {
        var table = new DataTable();
        table.Columns.Add("Column1");
        table.Columns.Add("Column2");
        table.Rows.Add(new[] { "col1row1", "col2row1" });
        table.Rows.Add(new[] { "col1row2", "col2row2" });

        var strings = table.Columns["Column2"].GetDataInColumn();

        strings.ToList().ForEach(s => Console.WriteLine(s));

        Console.ReadLine();
    }
}

//Will output
//col2row1
//col2row2
2
Fred 9 Авг 2014 в 06:54
Хороший ответ, но я думаю, что он заслуживает более подробного объяснения. @user3267755 пытался использовать Linq, но это не удалось, поскольку DataRowCollection не реализует IEnumerable, но реализует IEnumerable. См. базовый класс InternalDataCollectionBase. Enumerable.Cast позволяет методам Linq работать в таких сценариях, поскольку он создает коллекцию IEnumerable из IEnumerable.
 – 
Adam Venezia
9 Авг 2014 в 07:30