Можно ли переписать приведенный ниже код в подходе Linq / Lambda? - PullRequest
2 голосов
/ 25 августа 2011

Пока я сделал

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 ]

1 голос
/ 25 августа 2011

Я бы не советовал использовать следующее, потому что ваш код более эффективен. Но так как вы ищете пример для изучения ... вы можете использовать следующий оператор 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));
1 голос
/ 25 августа 2011

Вместо того, чтобы думать об этом как о строке, рассмотрите возможность использования 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()
                )
           );

Перевод этого в синтаксис лямбды:

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.

1 голос
/ 25 августа 2011

LINQ обычно используется для выбора и работы с подмножеством коллекции, то, что вы делаете, на самом деле не соответствует его цели.

Вы можете определить свои циклы foreach как лямбды, если вы действительно этого хотите, но вы не получите никакой особой выгоды.т.е.:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...