Skip to content

Commit a945416

Browse files
Add extension methods for List & HashSet for a lower allocation string.Join
1 parent dcd0a33 commit a945416

1 file changed

Lines changed: 140 additions & 0 deletions

File tree

src/ExtensionMethods.cs

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
using System.Collections.Generic;
33
using System.Linq;
44
using System.Reflection;
5+
using System.Text;
6+
using Oxide.Pooling;
57

68
namespace Oxide
79
{
@@ -106,6 +108,144 @@ public static bool TryPeek<T>(this Queue<T> queue, out T value)
106108

107109
#endif
108110

111+
public static string JoinValues(this IList<string> collection, char separator)
112+
{
113+
int listCount = collection.Count;
114+
if (listCount == 0)
115+
{
116+
return string.Empty;
117+
}
118+
119+
StringBuilder stringBuilder = PoolFactory<StringBuilder>.Shared.Take();
120+
try
121+
{
122+
int maxIndex = listCount - 1;
123+
for (int i = 0; i < listCount; i++)
124+
{
125+
string item = collection[i];
126+
stringBuilder.Append(item);
127+
128+
if (i >= maxIndex)
129+
{
130+
continue;
131+
}
132+
133+
stringBuilder.Append(separator);
134+
}
135+
136+
return stringBuilder.ToString();
137+
}
138+
finally
139+
{
140+
stringBuilder.Length = 0;
141+
PoolFactory<StringBuilder>.Shared.Return(stringBuilder);
142+
}
143+
}
144+
145+
public static string JoinValues(this IList<string> collection, string separator)
146+
{
147+
int collectionCount = collection.Count;
148+
if (collectionCount == 0)
149+
{
150+
return string.Empty;
151+
}
152+
153+
StringBuilder stringBuilder = PoolFactory<StringBuilder>.Shared.Take();
154+
try
155+
{
156+
int maxIndex = collectionCount - 1;
157+
for (int i = 0; i < collectionCount; i++)
158+
{
159+
string item = collection[i];
160+
stringBuilder.Append(item);
161+
162+
if (i >= maxIndex)
163+
{
164+
continue;
165+
}
166+
167+
stringBuilder.Append(separator);
168+
}
169+
170+
return stringBuilder.ToString();
171+
}
172+
finally
173+
{
174+
stringBuilder.Length = 0;
175+
PoolFactory<StringBuilder>.Shared.Return(stringBuilder);
176+
}
177+
}
178+
179+
public static string JoinValues(this HashSet<string> collection, string separator)
180+
{
181+
int collectionCount = collection.Count;
182+
if (collectionCount == 0)
183+
{
184+
return string.Empty;
185+
}
186+
187+
StringBuilder stringBuilder = PoolFactory<StringBuilder>.Shared.Take();
188+
try
189+
{
190+
int index = 0;
191+
foreach (string item in collection)
192+
{
193+
index++;
194+
195+
stringBuilder.Append(item);
196+
197+
if (index >= collectionCount)
198+
{
199+
continue;
200+
}
201+
202+
stringBuilder.Append(separator);
203+
}
204+
205+
return stringBuilder.ToString();
206+
}
207+
finally
208+
{
209+
stringBuilder.Length = 0;
210+
PoolFactory<StringBuilder>.Shared.Return(stringBuilder);
211+
}
212+
}
213+
214+
public static string JoinValues(this HashSet<string> collection, char separator)
215+
{
216+
int collectionCount = collection.Count;
217+
if (collectionCount == 0)
218+
{
219+
return string.Empty;
220+
}
221+
222+
StringBuilder stringBuilder = PoolFactory<StringBuilder>.Shared.Take();
223+
try
224+
{
225+
int index = 0;
226+
foreach (string item in collection)
227+
{
228+
index++;
229+
230+
stringBuilder.Append(item);
231+
232+
if (index >= collectionCount)
233+
{
234+
continue;
235+
}
236+
237+
stringBuilder.Append(separator);
238+
}
239+
240+
return stringBuilder.ToString();
241+
}
242+
finally
243+
{
244+
stringBuilder.Length = 0;
245+
PoolFactory<StringBuilder>.Shared.Return(stringBuilder);
246+
}
247+
}
248+
109249
#endregion
110250
}
111251
}

0 commit comments

Comments
 (0)