使用LINQ从DataTable获取数据

时间:2011-05-13 17:21:18

标签: c# linq 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执行此操作?

4 个答案:

答案 0 :(得分:4)

这与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 :(得分: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很棒,但我尝试只在它更清楚地表示我在做什么时才使用它。老实说,任何与处理集合的代码有关的事实都会成为事实上的答案,有时它不是答案。

答案 2 :(得分:3)

这不是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;
    });

答案 3 :(得分:1)

更通用的解决方案(也使用一些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));