我有一个数据表,我想将表的内容打印到控制台。
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执行此操作?
答案 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));