The StringBuilder extension in C # supports the chain method,
This article expands StringBuilder to support the chained method.
Here is a method for generating select elements based on a set of key values.
private static string BuilderSelectBox(IDictionary<int, string> options, string id, bool includeUnknown){ var html = new StringBuilder(); html.AppendFormat("<select id=\"{0}\" name=\"{0}\">", id); html.AppendLine(); if(includeUnknown) { html.AppendLine("\t<option>Unknown</option>"); } foreach(var opt in options) { html.AppendFormat("\t<option value=\"{0}\">{1}</option>", opt.Key, opt.Value); html.AppendLine(); } html.AppendLine("</select>"); return html.ToString();}
Above,
Html. AppendFormat ("<select id = \" {0} \ "name = \" {0} \ ">", id );
Html. AppendLine ();
These two statements can be encapsulated to extend StringBuilder.
Change
public static class StringBuilderExtensions{ public static StringBuilder AppendFormattedLine(this StringBuilder @this, string format, prams object[] args) => @this.AppendFormat(format, args).AppendLine();}private static string BuilderSelectBox(IDictionary<int, string> options, string id, bool includeUnknown){ var html = new StringBuilder() .AppendFormattedLine("<select id=\"{0}\" name=\"{0}\">", id); if(includeUnknown) { html.AppendLine("\t<option>Unknown</option>"); } foreach(var opt in options) { html.AppendFormattedLine("\t<option value=\"{0}\">{1}</option>", opt.Key, opt.Value); html.AppendLine(); } html.AppendLine("</select>"); return html.ToString();}
Above,
If (includeUnknown)
{
Html. AppendLine ("\ t <option> Unknown </option> ");
}
The preceding statement can be encapsulated to extend StringBuilder.
public static class StringBuilderExtensions{ public static StringBuilder AppendFormattedLine(this StringBuilder @this, string format, prams object[] args) => @this.AppendFormat(format, args).AppendLine(); public static StringBuilder AppendLineWhen(this StringBuilder @this, Func<bool> predicate, string value) => predicate() ? @this.AppendLine(value) : @this; }private static string BuilderSelectBox(IDictionary<int, string> options, string id, bool includeUnknown){ var html = new StringBuilder() .AppendFormattedLine("<select id=\"{0}\" name=\"{0}\">", id) .AppendLineWhen(() => includeUnknown, "\t<option>Unknown</option>"); foreach(var opt in options) { html.AppendFormattedLine("\t<option value=\"{0}\">{1}</option>", opt.Key, opt.Value); } html.AppendLine("</select>"); return html.ToString();}
Or
public static class StringBuilderExtensions{ public static StringBuilder AppendFormattedLine(this StringBuilder @this, string format, prams object[] args) => @this.AppendFormat(format, args).AppendLine(); public static StringBuilder AppendLineWhen(this StringBuilder @this, Func<bool> predicate, string value) => predicate() ? @this.AppendLine(value) : @this; public static StringBuilder AppendWhen(this StringBuilder @this, Func<bool> predicate, Func<StringBuilder, StringBuilder> fn) => predicate() ? fn(@this) : @this; }private static string BuilderSelectBox(IDictionary<int, string> options, string id, bool includeUnknown){ var html = new StringBuilder() .AppendFormattedLine("<select id=\"{0}\" name=\"{0}\">", id) .AppendWhen( () => includeUnknown, sb => sb.AppendLine("\t<option>Unknown</option>") ); foreach(var opt in options) { html.AppendFormattedLine("\t<option value=\"{0}\">{1}</option>", opt.Key, opt.Value); } html.AppendLine("</select>"); return html.ToString();}
Above,
Foreach (var opt in options)
{
Html. AppendFormattedLine ("\ t <option value = \" {0} \ ">{1} </option>", opt. Key, opt. Value );
}
Encapsulate traversal statements, expand StringBuilder, and finally:
public static class StringBuilderExtensions{ public static StringBuilder AppendFormattedLine(this StringBuilder @this, string format, prams object[] args) => @this.AppendFormat(format, args).AppendLine(); public static StringBuilder AppendLineWhen(this StringBuilder @this, Func<bool> predicate, string value) => predicate() ? @this.AppendLine(value) : @this; public static StringBuilder AppendWhen(this StringBuilder @this, Func<bool> predicate, Func<StringBuilder, StringBuilder> fn) => predicate() ? fn(@this) : @this; public static StringBuilder AppendSequence<T>(this StringBuilder @this, IEnumerable<T> seq, Func<StringBuilder, T, StringBuilder> fn) => seq.Aggregate(@this, fn); }private static string BuilderSelectBox(IDictionary<int, string> options, string id, bool includeUnknown){ var html = new StringBuilder() .AppendFormattedLine("<select id=\"{0}\" name=\"{0}\">", id) .AppendWhen( () => includeUnknown, sb => sb.AppendLine("\t<option>Unknown</option>") ) .AppendSequence(options, (sb, opt) => sb.AppendFormattedLine("\t<option value=\"{0}\">{1}</option>", opt.Key, opt.Value)) .AppendLine("</select>") .ToString();}