@@ -12,8 +12,6 @@ namespace Open.Text
1212{
1313 public static class StringBuilderExtensions
1414 {
15- private const string ParametersMissing = "Parameters missing." ;
16-
1715 /// <summary>
1816 /// Adds every entry to a StringBuilder.
1917 /// </summary>
@@ -39,7 +37,7 @@ public static StringBuilder ToStringBuilder<T>(this in ReadOnlySpan<T> source)
3937 /// <returns>The resultant StringBuilder.</returns>
4038 public static StringBuilder ToStringBuilder < T > ( this IEnumerable < T > source )
4139 {
42- if ( source is null ) throw new NullReferenceException ( ) ;
40+ if ( source is null ) throw new ArgumentNullException ( nameof ( source ) ) ;
4341 var sb = new StringBuilder ( ) ;
4442 foreach ( var s in source )
4543 sb . Append ( s ) ;
@@ -105,21 +103,10 @@ public static StringBuilder ToStringBuilder<T>(this in ReadOnlySpan<T> source, c
105103 /// <returns>The resultant StringBuilder.</returns>
106104 public static StringBuilder ToStringBuilder < T > ( this IEnumerable < T > source , string separator )
107105 {
108- if ( source is null ) throw new NullReferenceException ( ) ;
106+ if ( source is null ) throw new ArgumentNullException ( nameof ( source ) ) ;
109107 Contract . EndContractBlock ( ) ;
110108
111- if ( string . IsNullOrEmpty ( separator ) )
112- return ToStringBuilder ( source ) ;
113-
114- var first = true ;
115- var sb = new StringBuilder ( ) ;
116- foreach ( var s in source )
117- {
118- if ( first ) first = false ;
119- else sb . Append ( separator ) ;
120- sb . Append ( s ) ;
121- }
122- return sb ;
109+ return new StringBuilder ( ) . AppendAll ( source , separator ) ;
123110 }
124111
125112 /// <summary>
@@ -131,43 +118,47 @@ public static StringBuilder ToStringBuilder<T>(this IEnumerable<T> source, strin
131118 /// <returns>The resultant StringBuilder.</returns>
132119 public static StringBuilder ToStringBuilder < T > ( this IEnumerable < T > source , char separator )
133120 {
134- if ( source is null ) throw new NullReferenceException ( ) ;
121+ if ( source is null ) throw new ArgumentNullException ( nameof ( source ) ) ;
135122 Contract . EndContractBlock ( ) ;
136123
137- var sb = new StringBuilder ( ) ;
138- var first = true ;
139- foreach ( var s in source )
140- {
141- if ( first ) first = false ;
142- else sb . Append ( separator ) ;
143- sb . Append ( s ) ;
144- }
145- return sb ;
124+ return new StringBuilder ( ) . AppendAll ( source , separator ) ;
146125 }
147126
127+ /// <summary>
128+ /// Shortcut for adding an array of values to a StringBuilder.
129+ /// </summary>
130+ public static StringBuilder AppendAll < T > ( this StringBuilder target , IEnumerable < T > values )
131+ {
132+ if ( target is null )
133+ throw new ArgumentNullException ( nameof ( values ) ) ;
134+ Contract . EndContractBlock ( ) ;
135+
136+ if ( values == null ) return target ;
137+ foreach ( var value in values )
138+ target . Append ( value ) ;
139+ return target ;
140+ }
148141
149142 /// <summary>
150143 /// Shortcut for adding an array of values to a StringBuilder.
151144 /// </summary>
152- public static StringBuilder AppendAll < T > ( this StringBuilder target , IEnumerable < T > values , string ? separator = null )
145+ public static StringBuilder AppendAll < T > ( this StringBuilder target , IEnumerable < T > values , string separator )
153146 {
154147 if ( target is null )
155- throw new NullReferenceException ( ) ;
148+ throw new ArgumentNullException ( nameof ( values ) ) ;
156149 Contract . EndContractBlock ( ) ;
157150
158- if ( values != null )
159- {
160- if ( string . IsNullOrEmpty ( separator ) )
161- {
162- foreach ( var value in values )
163- target . Append ( value ) ;
164- }
165- else
166- {
167- foreach ( var value in values )
168- target . AppendWithSeparator ( separator ! , value ) ;
169- }
170- }
151+ if ( values == null ) return target ;
152+
153+ if ( string . IsNullOrEmpty ( separator ) )
154+ return target . AppendAll ( values ) ;
155+
156+ using var e = values . GetEnumerator ( ) ;
157+ if ( ! e . MoveNext ( ) ) return target ;
158+ if ( target . Length != 0 ) target . Append ( separator ) ;
159+ target . Append ( e . Current ) ;
160+ while ( e . MoveNext ( ) ) target . Append ( separator ) . Append ( e . Current ) ;
161+
171162 return target ;
172163 }
173164
@@ -177,48 +168,120 @@ public static StringBuilder AppendAll<T>(this StringBuilder target, IEnumerable<
177168 public static StringBuilder AppendAll < T > ( this StringBuilder target , IEnumerable < T > values , char separator )
178169 {
179170 if ( target is null )
180- throw new NullReferenceException ( ) ;
171+ throw new ArgumentNullException ( nameof ( values ) ) ;
181172 Contract . EndContractBlock ( ) ;
182173
183- if ( values != null )
184- foreach ( var value in values )
185- target . AppendWithSeparator ( separator , value ) ;
174+ if ( values == null ) return target ;
175+
176+ using var e = values . GetEnumerator ( ) ;
177+ if ( ! e . MoveNext ( ) ) return target ;
178+ if ( target . Length != 0 ) target . Append ( separator ) ;
179+ target . Append ( e . Current ) ;
180+ while ( e . MoveNext ( ) ) target . Append ( separator ) . Append ( e . Current ) ;
181+
186182 return target ;
187183 }
188184
185+ /// <summary>
186+ /// Shortcut for adding an array of values to a StringBuilder.
187+ /// </summary>
188+ public static StringBuilder AppendAll < T > ( this StringBuilder target , in ReadOnlySpan < T > values )
189+ {
190+ if ( target is null )
191+ throw new ArgumentNullException ( nameof ( values ) ) ;
192+ Contract . EndContractBlock ( ) ;
193+
194+ if ( values == null ) return target ;
195+ foreach ( var value in values )
196+ target . Append ( value ) ;
197+ return target ;
198+ }
199+
200+ /// <summary>
201+ /// Shortcut for adding an array of values to a StringBuilder.
202+ /// </summary>
203+ public static StringBuilder AppendAll < T > ( this StringBuilder target , in ReadOnlySpan < T > values , string separator )
204+ {
205+ if ( target is null )
206+ throw new ArgumentNullException ( nameof ( values ) ) ;
207+ Contract . EndContractBlock ( ) ;
208+
209+ if ( values == null ) return target ;
210+
211+ if ( string . IsNullOrEmpty ( separator ) )
212+ return target . AppendAll ( values ) ;
213+
214+ var e = values . GetEnumerator ( ) ;
215+ if ( ! e . MoveNext ( ) ) return target ;
216+ if ( target . Length != 0 ) target . Append ( separator ) ;
217+ target . Append ( e . Current ) ;
218+ while ( e . MoveNext ( ) ) target . Append ( separator ) . Append ( e . Current ) ;
219+
220+ return target ;
221+ }
222+
223+ /// <summary>
224+ /// Shortcut for adding an array of values to a StringBuilder.
225+ /// </summary>
226+ public static StringBuilder AppendAll < T > ( this StringBuilder target , in ReadOnlySpan < T > values , char separator )
227+ {
228+ if ( target is null )
229+ throw new ArgumentNullException ( nameof ( values ) ) ;
230+ Contract . EndContractBlock ( ) ;
231+
232+ if ( values == null ) return target ;
233+
234+ var e = values . GetEnumerator ( ) ;
235+ if ( ! e . MoveNext ( ) ) return target ;
236+ if ( target . Length != 0 ) target . Append ( separator ) ;
237+ target . Append ( e . Current ) ;
238+ while ( e . MoveNext ( ) ) target . Append ( separator ) . Append ( e . Current ) ;
239+
240+ return target ;
241+ }
189242
190243 /// <summary>
191244 /// Appends values to StringBuilder prefixing the provided separator.
192245 /// </summary>
193- public static StringBuilder AppendWithSeparator < T > ( this StringBuilder target , string separator , params T [ ] values )
246+ public static StringBuilder AppendWithSeparator < T > ( this StringBuilder target , string separator , T value , params T [ ] values )
194247 {
195248 if ( target is null )
196- throw new NullReferenceException ( ) ;
197- if ( values is null || values . Length == 0 )
198- throw new ArgumentException ( ParametersMissing ) ;
249+ throw new ArgumentNullException ( nameof ( values ) ) ;
199250 Contract . EndContractBlock ( ) ;
200251
201- if ( ! string . IsNullOrEmpty ( separator ) && target . Length != 0 )
202- target . Append ( separator ) ;
252+ if ( string . IsNullOrEmpty ( separator ) )
253+ {
254+ target . Append ( value ) ;
255+ foreach ( var v in values )
256+ target . Append ( v ) ;
257+ }
258+ else
259+ {
260+
261+ if ( target . Length != 0 )
262+ target . Append ( separator ) ;
263+ target . Append ( value ) ;
264+ foreach ( var v in values )
265+ target . Append ( separator ) . Append ( v ) ;
266+ }
203267
204- target . AppendAll ( values ) ;
205268 return target ;
206269 }
207270
208271 /// <summary>
209272 /// Appends values to StringBuilder prefixing the provided separator.
210273 /// </summary>
211- public static StringBuilder AppendWithSeparator < T > ( this StringBuilder target , char separator , params T [ ] values )
274+ public static StringBuilder AppendWithSeparator < T > ( this StringBuilder target , char separator , T value , params T [ ] values )
212275 {
213276 if ( target is null )
214- throw new NullReferenceException ( ) ;
215- if ( values is null || values . Length == 0 )
216- throw new ArgumentException ( ParametersMissing ) ;
277+ throw new ArgumentNullException ( nameof ( values ) ) ;
217278 Contract . EndContractBlock ( ) ;
218279
219280 if ( target . Length != 0 )
220281 target . Append ( separator ) ;
221- target . AppendAll ( values ) ;
282+ target . Append ( value ) ;
283+ foreach ( var v in values )
284+ target . AppendWithSeparator ( separator , v ) ;
222285
223286 return target ;
224287 }
0 commit comments