是否可以在Linq / Lambda方法中重写以下代码

时间:2011-08-25 10:25:11

标签: 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'>");
   htmlBuilder.Append(myRow[targetColumn.ColumnName].ToString());
   htmlBuilder.Append("</td>");
  }

  htmlBuilder.Append("</tr>");
 }

任何更好的方式......如Linq / Lambda方法

由于

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

我不建议使用以下内容,因为您的代码效率更高。但是,既然您正在寻找一个可以学习的示例......您可以使用以下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));

答案 2 :(得分:1)

不要将其视为字符串,而应考虑使用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视为使用字符串构建器的主要优点之一是,您将正确地转义无效字符串,例如&lt;&gt;&amp;“并确保有效的XHtml结果。