From 39bd0b0e6ac47be5b88fed7ba354054115264210 Mon Sep 17 00:00:00 2001 From: Alexander Radchenko Date: Fri, 25 Nov 2016 02:24:55 +0700 Subject: [PATCH 1/2] Implement StringBuilder AppendJoin API https://github.com/dotnet/corefx/issues/3419 --- src/mscorlib/src/System/Text/StringBuilder.cs | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) diff --git a/src/mscorlib/src/System/Text/StringBuilder.cs b/src/mscorlib/src/System/Text/StringBuilder.cs index f525118fa4b5..77c61268e12d 100644 --- a/src/mscorlib/src/System/Text/StringBuilder.cs +++ b/src/mscorlib/src/System/Text/StringBuilder.cs @@ -21,6 +21,7 @@ namespace System.Text { using System.Threading; using System.Globalization; using System.Diagnostics.Contracts; + using Collections.Generic; // This class represents a mutable string. It is convenient for situations in // which it is desirable to modify a string, perhaps by removing, replacing, or @@ -1011,6 +1012,100 @@ void ISerializable.GetObjectData(SerializationInfo info, StreamingContext contex return this; } + // Append joined values with a separator between each value. + public StringBuilder AppendJoin(string separator, IEnumerable values) + { + Contract.Ensures(Contract.Result() != null); + + using (var en = values.GetEnumerator()) + { + if (!en.MoveNext()) + return this; + + var value = en.Current; + if (value != null) + Append(value.ToString()); + + while (en.MoveNext()) + { + Append(separator); + value = en.Current; + if (value != null) + Append(value.ToString()); + } + } + return this; + } + + // Append joined values with a separator between each value. + public StringBuilder AppendJoin(string separator, params T[] values) + { + Contract.Ensures(Contract.Result() != null); + + if (values.Length == 0) + return this; + + var value = values[0]; + if (value != null) + Append(value.ToString()); + + for (var i = 1; i < values.Length; i++) + { + Append(separator); + value = values[i]; + if (value != null) + Append(value.ToString()); + } + return this; + } + + // Append joined values with a separator between each value. + public StringBuilder AppendJoin(char separator, IEnumerable values) + { + Contract.Ensures(Contract.Result() != null); + + using (var en = values.GetEnumerator()) + { + if (!en.MoveNext()) + return this; + + var value = en.Current; + if (value != null) + Append(value.ToString()); + + while (en.MoveNext()) + { + Append(separator); + value = en.Current; + if (value != null) + Append(value.ToString()); + } + } + return this; + } + + // Append joined values with a separator between each value. + public StringBuilder AppendJoin(char separator, params T[] values) + { + Contract.Ensures(Contract.Result() != null); + + if (values.Length == 0) + return this; + + var value = values[0]; + if (value != null) + Append(value.ToString()); + + for (var i = 1; i < values.Length; i++) + { + Append(separator); + value = values[i]; + if (value != null) + Append(value.ToString()); + } + return this; + } + /*====================================Insert==================================== ** ==============================================================================*/ From fadcdfea3c010591e05cb6c6e263fbe5f5ef8cb1 Mon Sep 17 00:00:00 2001 From: Alexander Radchenko Date: Fri, 25 Nov 2016 02:47:22 +0700 Subject: [PATCH 2/2] ArgumentNullException --- src/mscorlib/src/System/Text/StringBuilder.cs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/mscorlib/src/System/Text/StringBuilder.cs b/src/mscorlib/src/System/Text/StringBuilder.cs index 77c61268e12d..bbe1ce8aac8f 100644 --- a/src/mscorlib/src/System/Text/StringBuilder.cs +++ b/src/mscorlib/src/System/Text/StringBuilder.cs @@ -1017,6 +1017,8 @@ public StringBuilder AppendJoin(string separator, IEnumerable values) { Contract.Ensures(Contract.Result() != null); + Contract.Requires(values != null, nameof(values)); + using (var en = values.GetEnumerator()) { if (!en.MoveNext()) @@ -1042,6 +1044,8 @@ public StringBuilder AppendJoin(string separator, params T[] values) { Contract.Ensures(Contract.Result() != null); + Contract.Requires(values != null, nameof(values)); + if (values.Length == 0) return this; @@ -1064,20 +1068,22 @@ public StringBuilder AppendJoin(char separator, IEnumerable values) { Contract.Ensures(Contract.Result() != null); + Contract.Requires(values != null, nameof(values)); + using (var en = values.GetEnumerator()) { if (!en.MoveNext()) return this; var value = en.Current; - if (value != null) + if (null != value) Append(value.ToString()); while (en.MoveNext()) { Append(separator); value = en.Current; - if (value != null) + if (null != value) Append(value.ToString()); } } @@ -1089,18 +1095,20 @@ public StringBuilder AppendJoin(char separator, params T[] values) { Contract.Ensures(Contract.Result() != null); + Contract.Requires(values != null, nameof(values)); + if (values.Length == 0) return this; var value = values[0]; - if (value != null) + if (null != value) Append(value.ToString()); for (var i = 1; i < values.Length; i++) { Append(separator); value = values[i]; - if (value != null) + if (null != value) Append(value.ToString()); } return this;