получение данных из DataTable с помощью LINQ

#c# #linq #datatable

#c# #linq #datatable

Вопрос:

У меня есть datatable, и я хочу вывести содержимое таблицы на консоль.

 System.Data.DataTable dt = new System.Data.DataTable();
dt.Columns.Add("FName");
dt.Columns.Add("LName");

DataRow dr;
dr = dt.NewRow();
dr["FName"] = "FName1";
dr["LName"] = "LName1";
dt.Rows.Add(dr);


dr = dt.NewRow();
dr["FName"] = "FName2";
dr["LName"] = "LName2";
dt.Rows.Add(dr);

dr = dt.NewRow();
dr["FName"] = "FName3";
dr["LName"] = "LName3";
dt.Rows.Add(dr);
  

Я хочу выводить на консоль следующим образом:

 Row 1: FNAme = Fname1, LName = LName1
Row 2: FNAme = Fname2, LName = LName2
Row 2: FNAme = Fname3, LName = LName3
  

Как я могу это сделать с помощью LINQ?

Комментарии:

1. LINQ к Dataset вам в этом случае не поможет. Выполнение цикла foreach имеет больше смысла.

2. Есть ли причина, по которой вы используете DataTable вместо определенного класса?

3. Я использую TableParaeter в SQL-запросе. Просто для целей отладки я хотел напечатать значения, передаваемые в SP.

Ответ №1:

Это не имеет ничего общего с LINQ , вам нужно будет перебирать элементы.

 StringBuilder sb = new StringBuilder();
foreach (DataRow dr in DataTable.Rows)
{
    sb.Append(String.Format("Row {0}: FNAme = {1}, LName = {2}", dt.Rows.IndexOf(row)   1, dr["FName"], dr["LName"]));
}
  

Комментарии:

1. я буду использовать ForEach. Спасибо за ответ. Я действительно думал, что это может быть сложно сделать с помощью LINQ.

Ответ №2:

На самом деле это не является целью LINQ, но если вы действительно хотите…

 dt.Rows.Cast<DataRow>()
  .Select((DataRow dr, int i) =>
    {
      return String.Format("Row {0}: FNAme = {1}, LName = {2}", i, dr["FName"], dr["LName"]);
    })
  .All((line) =>
    {
      Console.WriteLine(line);
      return true;
    });
  

Комментарии:

1. Вау. Я использовал ForEach, но ваш ответ очень хорош. Именно то, что я хотел. Мне нужно будет понять ваш запрос. Большое спасибо.

Ответ №3:

Итак, вы могли бы использовать LINQ и написать что-то вроде этого

 DataTable.Rows.ToList().ForEach(r => Console.WriteLine(String.Format("Row {0}: FNAme = {1}, LName = {2}", dr.Rows.IndexOf(r)   1, r.Item["FName"], r.Item["LName"])
  

Но для того, что вы делаете, foreach цикл имеет больше смысла

 //Borrowing Dustin Lanes foreach here.

StringBuilder sb = new StringBuilder();
foreach (DataRow dr in DataTable.Rows)
{
    sb.Append(String.Format("Row {0}: FNAme = {1}, LName = {2}", dt.Rows.IndexOf(row)   1, dr["FName"], dr["LName"]));
}
  

Причина, по которой я говорю, что цикл foreach имеет больше смысла, заключается в том, что так понятнее, что вы делаете. Реализация проще.

LINQ великолепен, но я стараюсь использовать его только тогда, когда он обеспечивает более четкое представление о том, что я делаю. Честно говоря, это становится ответом по умолчанию для любого действия с любым кодом, имеющим дело с коллекциями, а иногда это не ответ.

Комментарии:

1. Когда я использовал ForEach, люди говорили «Используй LINQ», а теперь, когда я использую LINQ практически для всего, мне говорят использовать ForEach. Я думаю, это полностью зависит от чистоты кода.

2. @ASdfg, это полностью ситуативно, вы бы не использовали бензопилу для выпалывания сорняков, и вы бы не использовали нож, чтобы срубить дерево.

Ответ №4:

Более общее решение (также использующее некоторый LINQ, поскольку у вас, похоже, есть к нему интерес ;-))

 DataTable dt = ...;

string formatStr = String.Join(", ", Enumerable.Range(0, dt.Columns.Count)
    .Select(c => dt.Columns[c].ColumnName   " = {"   c   "}").ToArray());

for (int i = 0; i < dt.Rows.Count; i  )
    Console.WriteLine("Row "   i   ": "   String.Format(formatStr, dt.Rows[i].ItemArray));
  

Комментарии:

1. я полностью одержим LINQ. 😉 Ваш ответ очень ценится.