是否可以用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/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。