Skip to content

Commit 72e6448

Browse files
author
Oren (electricessence)
committed
Updates.
1 parent d84fbf4 commit 72e6448

3 files changed

Lines changed: 482 additions & 124 deletions

File tree

Open.Text.csproj

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ Part of the "Open" set of libraries.</Description>
1515
<RepositoryType>git</RepositoryType>
1616
<RepositoryUrl>https://github.com/electricessence/Open.Text</RepositoryUrl>
1717
<PackageTags>dotnet, dotnetcore, string, text, format, stringbuilder, extensions</PackageTags>
18-
<Version>1.2.0</Version>
19-
<PackageReleaseNotes>Implemented updated for C# 7.2 features.</PackageReleaseNotes>
20-
<AssemblyVersion>1.2.0.0</AssemblyVersion>
21-
<FileVersion>1.2.0.0</FileVersion>
18+
<Version>2.0.4</Version>
19+
<PackageReleaseNotes></PackageReleaseNotes>
20+
<AssemblyVersion>2.0.4.0</AssemblyVersion>
21+
<FileVersion>2.0.4.0</FileVersion>
2222
</PropertyGroup>
2323

2424
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
@@ -37,7 +37,7 @@ Part of the "Open" set of libraries.</Description>
3737
</ItemGroup>
3838

3939
<ItemGroup>
40-
<PackageReference Include="System.Memory" Version="4.5.1" />
40+
<PackageReference Include="Open.MemoryExtensions" Version="2.0.1" />
4141
</ItemGroup>
4242

4343
</Project>

StringBuilderExtensions.cs

Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Diagnostics.Contracts;
4+
using System.Text;
5+
6+
namespace Open.Text
7+
{
8+
public static class StringBuilderExtensions
9+
{
10+
public static StringBuilder ToStringBuilder<T>(this in ReadOnlySpan<T> source)
11+
{
12+
var len = source.Length;
13+
var sb = new StringBuilder(len);
14+
15+
for (var i = 0; i < len; i++)
16+
sb.Append(source[i]);
17+
18+
return sb;
19+
}
20+
21+
public static StringBuilder ToStringBuilder<T>(this IEnumerable<T> source)
22+
{
23+
var sb = new StringBuilder();
24+
foreach (var s in source)
25+
sb.Append(s);
26+
27+
return sb;
28+
}
29+
30+
public static StringBuilder ToStringBuilder<T>(this in ReadOnlySpan<T> source, in string separator)
31+
{
32+
var len = source.Length;
33+
if (len < 2 || string.IsNullOrEmpty(separator))
34+
return ToStringBuilder(source);
35+
36+
var sb = new StringBuilder(2 * len - 1);
37+
38+
sb.Append(source[0]);
39+
for (var i = 1; i < len; i++)
40+
{
41+
sb.Append(separator);
42+
sb.Append(source[i]);
43+
}
44+
45+
return sb;
46+
}
47+
48+
public static StringBuilder ToStringBuilder<T>(this in ReadOnlySpan<T> source, in char separator)
49+
{
50+
var len = source.Length;
51+
if (len < 2)
52+
return ToStringBuilder(source);
53+
54+
var sb = new StringBuilder(2 * len - 1);
55+
56+
sb.Append(source[0]);
57+
for (var i = 1; i < len; i++)
58+
{
59+
sb.Append(separator);
60+
sb.Append(source[i]);
61+
}
62+
63+
return sb;
64+
}
65+
66+
public static StringBuilder ToStringBuilder<T>(this IEnumerable<T> source, in string separator)
67+
{
68+
var sb = new StringBuilder();
69+
var first = true;
70+
foreach (var s in source)
71+
{
72+
if (first) first = false;
73+
else sb.Append(separator);
74+
sb.Append(s);
75+
}
76+
return sb;
77+
}
78+
79+
public static StringBuilder ToStringBuilder<T>(this IEnumerable<T> source, in char separator)
80+
{
81+
var sb = new StringBuilder();
82+
var first = true;
83+
foreach (var s in source)
84+
{
85+
if (first) first = false;
86+
else sb.Append(separator);
87+
sb.Append(s);
88+
}
89+
return sb;
90+
}
91+
92+
93+
/// <summary>
94+
/// Shortcut for adding an array of values to a StringBuilder.
95+
/// </summary>
96+
public static StringBuilder AppendAll<T>(this StringBuilder target, IEnumerable<T> values, string separator = null)
97+
{
98+
if (target == null)
99+
throw new NullReferenceException();
100+
Contract.EndContractBlock();
101+
102+
if (values != null)
103+
{
104+
if (string.IsNullOrEmpty(separator))
105+
{
106+
foreach (var value in values)
107+
target.Append(value);
108+
}
109+
else
110+
{
111+
foreach (var value in values)
112+
target.AppendWithSeparator(separator, value);
113+
}
114+
}
115+
return target;
116+
}
117+
118+
/// <summary>
119+
/// Shortcut for adding an array of values to a StringBuilder.
120+
/// </summary>
121+
public static StringBuilder AppendAll<T>(this StringBuilder target, IEnumerable<T> values, in char separator)
122+
{
123+
if (target == null)
124+
throw new NullReferenceException();
125+
Contract.EndContractBlock();
126+
127+
if (values != null)
128+
foreach (var value in values)
129+
target.AppendWithSeparator(in separator, value);
130+
return target;
131+
}
132+
133+
134+
/// <summary>
135+
/// Appends values to StringBuilder prefixing the provided separator.
136+
/// </summary>
137+
public static StringBuilder AppendWithSeparator<T>(this StringBuilder target, string separator, params T[] values)
138+
{
139+
if (target == null)
140+
throw new NullReferenceException();
141+
if (values == null || values.Length == 0)
142+
throw new ArgumentException("Parameters missing.");
143+
Contract.EndContractBlock();
144+
145+
if (!string.IsNullOrEmpty(separator) && target.Length != 0)
146+
target.Append(separator);
147+
148+
target.AppendAll(values);
149+
return target;
150+
}
151+
152+
/// <summary>
153+
/// Appends values to StringBuilder prefixing the provided separator.
154+
/// </summary>
155+
public static StringBuilder AppendWithSeparator<T>(this StringBuilder target, in char separator, params T[] values)
156+
{
157+
if (target == null)
158+
throw new NullReferenceException();
159+
if (values == null || values.Length == 0)
160+
throw new ArgumentException("Parameters missing.");
161+
Contract.EndContractBlock();
162+
163+
if (target.Length != 0)
164+
target.Append(separator);
165+
target.AppendAll(values);
166+
167+
return target;
168+
}
169+
170+
/// <summary>
171+
/// Appends a key/value pair to StringBuilder using the provided separators.
172+
/// </summary>
173+
public static void AppendWithSeparator<T>(this StringBuilder target, IDictionary<string, T> source, string key, string itemSeparator, string keyValueSeparator)
174+
{
175+
if (target == null)
176+
throw new NullReferenceException();
177+
if (source == null)
178+
throw new ArgumentNullException(nameof(source));
179+
if (key == null)
180+
throw new ArgumentNullException(nameof(key));
181+
if (itemSeparator == null)
182+
throw new ArgumentNullException(nameof(itemSeparator));
183+
if (keyValueSeparator == null)
184+
throw new ArgumentNullException(nameof(keyValueSeparator));
185+
Contract.EndContractBlock();
186+
187+
if (source.TryGetValue(key, out var result))
188+
target
189+
.AppendWithSeparator(itemSeparator, key)
190+
.Append(keyValueSeparator)
191+
.Append(result);
192+
}
193+
}
194+
}

0 commit comments

Comments
 (0)