From e959ab20e28b42a8b45f5bc14e65f2d4f3589642 Mon Sep 17 00:00:00 2001 From: Alexander Radchenko Date: Sat, 10 Dec 2016 00:37:23 +0700 Subject: [PATCH] StringBuilder.AppendJoin (appending lists to StringBuilder) (dotnet/coreclr#8350) Adding StringBuilder.AppendJoin Commit migrated from https://github.com/dotnet/coreclr/commit/37b9f18d22d45be7d3d3c6651a4cef819dfe0fdf --- src/coreclr/src/mscorlib/model.xml | 4 ++ .../src/mscorlib/src/System/Text/StringBuilder.cs | 83 ++++++++++++++++++++++ 2 files changed, 87 insertions(+) diff --git a/src/coreclr/src/mscorlib/model.xml b/src/coreclr/src/mscorlib/model.xml index b4cd2bd..33c6525 100644 --- a/src/coreclr/src/mscorlib/model.xml +++ b/src/coreclr/src/mscorlib/model.xml @@ -7861,6 +7861,10 @@ + + + + diff --git a/src/coreclr/src/mscorlib/src/System/Text/StringBuilder.cs b/src/coreclr/src/mscorlib/src/System/Text/StringBuilder.cs index f525118..e81d90c 100644 --- a/src/coreclr/src/mscorlib/src/System/Text/StringBuilder.cs +++ b/src/coreclr/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 System.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,88 @@ namespace System.Text { return this; } + // Append joined values with a separator between each value. + public unsafe StringBuilder AppendJoin(char separator, params T[] values) + { + // Defer argument validation to the internal function + return AppendJoinCore(&separator, 1, values); + } + + public unsafe StringBuilder AppendJoin(string separator, params T[] values) + { + separator = separator ?? string.Empty; + fixed (char* pSeparator = separator) + { + // Defer argument validation to the internal function + return AppendJoinCore(pSeparator, separator.Length, values); + } + } + + public unsafe StringBuilder AppendJoin(char separator, IEnumerable values) + { + // Defer argument validation to the internal function + return AppendJoinCore(&separator, 1, values); + } + + public unsafe StringBuilder AppendJoin(string separator, IEnumerable values) + { + separator = separator ?? string.Empty; + fixed (char* pSeparator = separator) + { + // Defer argument validation to the internal function + return AppendJoinCore(pSeparator, separator.Length, values); + } + } + + private unsafe StringBuilder AppendJoinCore(char* separator, int separatorLength, params T[] values) + { + if (values == null) + throw new ArgumentNullException(nameof(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, separatorLength); + value = values[i]; + if (value != null) + Append(value.ToString()); + } + return this; + } + + private unsafe StringBuilder AppendJoinCore(char* separator, int separatorLength, IEnumerable values) + { + if (values == null) + throw new ArgumentNullException(nameof(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, separatorLength); + value = en.Current; + if (value != null) + Append(value.ToString()); + } + } + return this; + } + /*====================================Insert==================================== ** ==============================================================================*/ -- 2.7.4