Построение строки из EntityCollection

#c# #.net #string #linq #concatenation

#c# #.net #строка #linq #конкатенация

Вопрос:

Есть ли более эффективный способ сделать это с помощью LINQ или String.Join ?

 var sb = new StringBuilder();
foreach (var s in cls.Students)
  sb.Append("<div id="s"   s.Id   "">"   s.FirstName  
            " "   s.LastName   "</div>");
  

Комментарии:

1. Данные проверяются перед отправкой в базу данных и cls берут данные непосредственно из базы данных на том же сервере, что и веб-приложение (это приложение для внутренней сети). Я не вижу возможности для XSS?

2. Мое веб-приложение позволяет вводить только определенные символы. По общему признанию, если данные вводятся непосредственно в MySQL (т. Е. Не Через приложение), тогда все может пойти в грушевидную форму.

Ответ №1:

Вы можете использовать string.Concat :

 string result = string.Concat(cls.Students.Select(
    s => string.Format("<div id="s{0}">{1} {2}</div>", s.Id, s.FirstName, s.LastName)
));
  

Это немного более лаконично, но, вероятно, не даст вам большей производительности. Использование a StringBuilder уже очень эффективно.

Примечания

  • В .NET 3.5 и более ранних версиях вам также нужно будет добавить .ToArray() непосредственно перед последней круглой скобкой.
  • Вы должны экранировать HTML s.FirstName и s.LastName . Я предполагаю s.ID , что это целое число и, следовательно, безопасно.

Комментарии:

1. Спасибо. Нужно ли мне избегать их, даже если cls данные берутся прямо из базы данных, которая, как я знаю, содержит проверенные данные?

2. @James: Это была бы очень хорошая идея. Они могут быть проверены сегодня, но это может измениться в будущем.

Ответ №2:

Я бы сделал что-то вроде этого.

 StringBuilder builder = new StringBuilder();
cls.Students.ForEach(s => builder.Append(HttpUtility.HtmlEncode(string.Format("<div id="{0}">{1} {2}</div>", s.Id, s.FirstName, s.LastName)));
  

Комментарии:

1. .ForEach не отображается в моем IntelliSense — нужно ли мне добавлять ссылку?

2. cls.Students — это список студентов, не так ли? ForEach является частью системы. Коллекции. Общее пространство имен.

3. Это EntityCollection , но я могу ToList() это, что решает проблему. Спасибо.

Ответ №3:

vb в

 Dim XXX As System.Xml.Linq.XElement = <div id=<%="s"   s.Id %> ><%= s.FirstName  %> <%= s.LastName  %></div>
  

Без кавычек