#c# #datatable
#c# #datatable
Вопрос:
У меня есть datatable, в котором месяц указан в качестве последнего столбца. Мне нужно напечатать все строки, где месяц = currentMonth. Так, например, в этом месяце будет март, в следующем месяце будет апрель и т.д.
Используя приведенные ниже примеры данных — как мне напечатать CN и SS для всех строк, где SS = текущий месяц?
И я хочу распечатать на консоли … т. е. Console.PrintLine();
static void Main(string[] args)
{
DataTable dtData = new DataTable();
dtData.Columns.Add("CN", typeof(string));
dtData.Columns.Add("AN", typeof(string));
dtData.Columns.Add("SN", typeof(string));
dtData.Columns.Add("CE", typeof(string));
dtData.Columns.Add("TSD", typeof(DateTime));
dtData.Columns.Add("TSC", typeof(DateTime));
dtData.Columns.Add("T1S", typeof(DateTime));
dtData.Columns.Add("T1C", typeof(DateTime));
dtData.Columns.Add("T2S", typeof(DateTime));
dtData.Columns.Add("T2C", typeof(DateTime));
dtData.Columns.Add("SS", typeof(string));
dtData.Rows.Add("1111", "TestSN", "email", DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, "March");
dtData.Rows.Add("2222", "TestSN1", "email1", DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, "July");
dtData.Rows.Add("3333", "TestSN2", "email2", DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, "January");
dtData.Rows.Add("4444", "TestSN3", "email3", DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, "April");
dtData.Rows.Add("5555", "TestSN4", "email4", DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, "October");
dtData.Rows.Add("6666", "TestSN5", "email5", DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, "December");
dtData.Rows.Add("7777", "TestSN6", "email6", DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, "March");
}
Комментарии:
1. Пожалуйста, будьте более конкретны. Что вы подразумеваете под «печатью данных»? Вы имеете в виду на физический принтер? Предпринимали ли вы какие-либо попытки распечатать эти данные самостоятельно? Если да, пожалуйста, добавьте это в вопрос.
2. @Amy — Консоль извинений. PrintLine();
3. Вы пробовали выполнять итерации по строкам datatable, сравнивая значение последнего столбца с текущим
DateTime
и выводя соответствующие?
Ответ №1:
Вы можете использовать метод выбора DataTable, чтобы выбрать только те строки, в которых столбец SS равен этому месяцу.
var allRows = dt.Select($"SS='{DateTime.Now.ToString("MMMM", CultureInfo.InvariantCulture)}'");
foreach(var r in allRows)
{
Console.WriteLine($"{r["CN"].ToString()}, {r["SS"].ToString()}");
}
Вывод:
1111, March
7777, March
Кроме того, ваш приведенный выше код не компилируется. Похоже, эту строку в вашем коде следует удалить:
dtData.Columns.Add("CE", typeof(string));
Комментарии:
1. Что означает $ «SS =»?
2. $ — это новый способ произносить строку. Форматирование. Результатом является оператор выбора таблицы данных «Где SS = ‘March'»
Ответ №2:
Возможно, что-то вроде этого:
foreach (DataRow r in dtData.Rows)
{
if (r["SS"].ToString() == DateTime.Now.ToString("MMMM"))
{
Console.WriteLine(r["CN"].ToString() r["SS"].ToString());
}
}
Ответ №3:
что вам нужно, так это простой запрос select для ваших данных:
string expression = $"SS = '{DateTime.Now.ToString("MMMM")}'";
var filteredData = dtData.Select(expression);
foreach(var item in filteredData)
{
Console.WriteLine($"CN: {item["CN"]}, SS: {item["SS"]}");
}
кстати, в вашем примере есть еще одна проблема, из-за которой вы забыли, что ваши строковые столбцы равны 4, и вы вставляете 3 строки в свои строки:
dtData.Rows.Add("1111", "TestSN", "email", "CE", DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, "March");
dtData.Rows.Add("2222", "TestSN1", "email1", "CE", DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, "July");
dtData.Rows.Add("3333", "TestSN2", "email2", "CE", DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, "January");
dtData.Rows.Add("4444", "TestSN3", "email3", "CE", DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, "April");
dtData.Rows.Add("5555", "TestSN4", "email4", "CE", DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, "October");
dtData.Rows.Add("6666", "TestSN5", "email5", "CE", DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, "December");
dtData.Rows.Add("7777", "TestSN6", "email6", "CE", DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, "March");