是否可以用Linq/Lambda方法重写下面的代码?
本文关键字:重写 代码 方法 Lambda Linq 是否 | 更新日期: 2023-09-27 18:06:32
到目前为止,我已经做了
foreach (DataRow myRow in targetTable.Rows)
{
htmlBuilder.Append("<tr align='left' valign='top'>");
foreach (DataColumn targetColumn in targetTable.Columns)
{
htmlBuilder.Append("<td align='left' valign='top'>");
htmlBuilder.Append(myRow[targetColumn.ColumnName].ToString());
htmlBuilder.Append("</td>");
}
htmlBuilder.Append("</tr>");
}
有更好的方法吗?如Linq/Lambda方法
谢谢
LINQ通常用于选择和操作集合的子集,您所做的并不真正符合其目的。
如果你真的想的话,你可以把你的foreach循环定义为lambdas,但是你不会得到任何特别的好处。即:
Action<DataColumn> buildAction = (DataColumn targetColumn) =>
{
htmlBuilder.Append("<td align='left' valign='top'>");
htmlBuilder.Append(myRow[targetColumn.ColumnName].ToString());
htmlBuilder.Append("</td>");
};
targetTable.Columns.ForEach(buildAction);
我不建议使用下面的代码,因为你的代码更有效率。但是既然你正在寻找一个学习的例子,你可以使用下面的LINQ语句来达到同样的结果。
var sb = new StringBuilder();
const string ROWBEGIN = "<tr align='left' valign='top'>";
const string ROWEND = "</tr>";
const string CELLBEGIN = "<td align='left' valign='top'>";
const string CELLEND = "</td>";
targetTable.AsEnumerable()
.Select(row => string.Format("{0}{1}{2}",
ROWBEGIN,
string.Join(string.Empty,
row.Table.Columns
.Cast<DataColumn>()
.Select(column => string.Format("{0}{1}{2}",
CELLBEGIN,
(row.IsNull(column) ? string.Empty : row[column].ToString()),
CELLEND))
.ToArray()
),
ROWEND)
)
.ToList()
.ForEach(y => sb.Append(y));
与其将其视为字符串,不如考虑使用LINQ to XML来生成节点:
var rows = from row in targetTable.Rows.AsEnumerable()
select new XElement("tr",
new XAttribute("align", "left"),
new XAttribute("valign","top"),
from column in targetTable.Columns.AsEnumerable()
select new XElement("td",
new XAttribute("align", "left"),
new XAttribute("valign", "top"),
myRow[targetColumn.ColumnName].ToString()
)
);
翻译成Lambda语法:
var rows = targetTable.Rows.AsEnumerable().Select(row => new XElement("tr",
new XAttribute("align", "left"),
new XAttribute("valign","top"),
targetTable.Columns.AsEnumerable().Select(column => new XElement("td",
new XAttribute("align", "left"),
new XAttribute("valign", "top"),
myRow[targetColumn.ColumnName].ToString()
))
));
如果需要将结果作为字符串。只需对行调用ToString()。
与使用字符串构建器相比,将此视为XML的一个主要优点是,您将正确地转义无效字符串,如<>&",并确保生成有效的XHtml。