C# 可以用Linq/Lambda方法重写下面的代码吗

C# 可以用Linq/Lambda方法重写下面的代码吗,c#,linq,lambda,C#,Linq,Lambda,到目前为止,我已经做到了 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'>");

到目前为止,我已经做到了

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));

而不是把它看作一个字符串,考虑使用LINQtoXML来生成节点:

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。

您知道什么是LINQ或C lambda吗?有什么特别的原因吗?如果可以的话,以LINQ或Lambda的方式这样做会带来什么好处?或者您只是想看看会发生什么,这很好?为什么要使用LINQ来实现这一点?LINQ并不是神奇的,它可以用于任何编程任务,包括循环imho。原因是我正在考虑这个问题,希望使用这些新功能进行编程,而不是为了它而使用新功能进行编程。为您的代码部分使用最佳功能的程序。在这种情况下,我认为大家普遍认为LINQ不是解决问题的办法。如果你想了解LINQ,可以在网上阅读一些教程。在有限的答案空间内,这种缩进是没有帮助的-