Skip to content

Commit 9d19b0f

Browse files
Updates.
1 parent 94d3aba commit 9d19b0f

5 files changed

Lines changed: 124 additions & 70 deletions

File tree

Source/.editorconfig

Lines changed: 0 additions & 10 deletions
This file was deleted.

Source/Extensions._.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ public static string ToTitleCase(this string source, CultureInfo? cultureInfo =
7676
/// <param name="values">The set of values to validate.</param>
7777
/// <returns>True if any of the provided values is is null, empty or white-space only. Otherwise false.</returns>
7878
public static bool IsAnyNullOrWhiteSpace(params string[] values)
79-
=> values != null && values.Length != 0 && values.Any(string.IsNullOrWhiteSpace);
79+
=> values != null && values.Length != 0 && values.Any(v => string.IsNullOrWhiteSpace(v));
8080

8181
/// <summary>
8282
/// Throws if null, empty or white-space only.
@@ -224,7 +224,7 @@ public static string ToString(this float? value, string format, float defaultVal
224224
/// Shortcut for formating to a percent.
225225
/// </summary>
226226
public static string ToPercentString(this int value, int range, int decimals = 0, CultureInfo? cultureInfo = default)
227-
=> ((double)value / range).ToString("p" + decimals, cultureInfo);
227+
=> ((double)value / range).ToString($"p{decimals}", cultureInfo);
228228

229229

230230
/// <summary>

Source/Open.Text.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
<RepositoryUrl>https://github.com/Open-NET-Libraries/Open.Text</RepositoryUrl>
1818
<RepositoryType>git</RepositoryType>
1919
<PackageTags>dotnet, dotnetcore, string, span, readonlyspan, text, format, split, trim, first, last, preceding, following, stringbuilder, extensions</PackageTags>
20-
<Version>3.1.0</Version>
20+
<Version>3.1.1</Version>
2121
<PackageReleaseNotes></PackageReleaseNotes>
2222
<PackageLicenseExpression>MIT</PackageLicenseExpression>
2323
<PublishRepositoryUrl>true</PublishRepositoryUrl>

Source/StringBuilderExtensions.cs

Lines changed: 120 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

Tests/Open.Text.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
<TargetFramework>net5.0</TargetFramework>
55
<Nullable>enable</Nullable>
66
<IsPackable>false</IsPackable>
7+
<EnableNETAnalyzers>false</EnableNETAnalyzers>
78
</PropertyGroup>
89

910
<ItemGroup>

0 commit comments

Comments
 (0)