ZLinqでString.JoinしたいときはJoinToString

追記:JoinToStringという便利なメソッド実装されてました。これを使いましょう!

JoinToString.cs
string[] nameParts = { "The", "One", "Ring" };
string ringName = nameParts
    .AsValueEnumerable()
    .Select(part => part.ToUpper())
    .JoinToString(" ");

// ringName = "THE ONE RING"
github.comCysharp/ZLinq?tab=readme-ov-file

以下、「ZLinqとZStringでJoinedBy」というタイトルで公開していた時の残骸。

ExtraLINQにあったJoinedByをZLinq向けに移植。

JoinedBy.cs
string[] nameParts = { "The", "One", "Ring" };
string ringName = nameParts
    .AsValueEnumerable()
    .Select(part => part.ToUpper())
    .JoinedBy(" ");

// ringName = "THE ONE RING"
JoinedBy.cs
public static class ZLinqExtensions
{
    public static string JoinedBy<TEnumerator, TSource>(this ValueEnumerable<TEnumerator, TSource> source, string separator)
        where TEnumerator : struct, IValueEnumerator<TSource>
#if NET9_0_OR_GREATER
        , allows ref struct
#endif
    {
        var enumerator = source.Enumerator;

        if (enumerator.TryGetSpan(out var span))
        {
            using var sb = ZString.CreateStringBuilder();

            var first = true;
            foreach (var item in span)
            {
                if (!first) sb.Append(separator);
                first = false;

                sb.Append(item);
            }

            return sb.ToString();
        }

        {
            using var sb = ZString.CreateStringBuilder();

            var first = true;
            while (enumerator.TryGetNext(out var current))
            {
                if (!first) sb.Append(separator);
                first = false;

                sb.Append(current);
            }

            return sb.ToString();
        }
    }
}