Я хочу преобразовать один столбец моей таблицы данных в список строк с помощью 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;
}
3 ответа
Я использовал часть кода @RobertHarvey. У них было слишком много петель, а Console.Write
не писал на моей странице. Этот фрагмент кода взял указанный мной столбец и записал его в виде списка на мою страницу.
private void PrintTable(DataTable table)
{
foreach (DataRow row in table.Rows)
{
Response.Write(row[column] + "<br />");
}
}
Итерируйте 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] + " ");
}
}
Поскольку обе ваши попытки были в 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
Похожие вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.
Console.Write(row[column] + " ");
, но он по-прежнему ничего не записывает, хотя у меня есть данные в моем столбце.Response.Write
сConsole.Write
, и теперь он отображает данные, но ваши циклы выполняются слишком много раз.