From ff1b1872aec001fad8664a72736a7b407d926320 Mon Sep 17 00:00:00 2001 From: Erik White Date: Sat, 20 Jan 2024 00:31:35 +0100 Subject: [PATCH 1/2] Return empty entries on split --- Directory.Build.props | 2 +- .../Split/SpanSplitExtensions.cs | 48 +++++++------------ 2 files changed, 19 insertions(+), 31 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index a237ed1..000e041 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -18,7 +18,7 @@ LTR Data Olof Lagerkvist ..\$(Configuration) - 1.0.9 + 1.0.10 true $(LocalNuGetPath) true diff --git a/LTRData.Extensions/Split/SpanSplitExtensions.cs b/LTRData.Extensions/Split/SpanSplitExtensions.cs index f0ac343..c8a216a 100644 --- a/LTRData.Extensions/Split/SpanSplitExtensions.cs +++ b/LTRData.Extensions/Split/SpanSplitExtensions.cs @@ -65,8 +65,7 @@ public static StringSplitByStringEnumerator SplitReverse(this ReadOnlySpan /// Iterator public static IEnumerable> Split(this ReadOnlyMemory chars, char delimiter, StringSplitOptions options = StringSplitOptions.None) { - while (!chars.IsEmpty) - { + do { var i = chars.Span.IndexOf(delimiter); if (i < 0) { @@ -82,8 +81,7 @@ public static IEnumerable> Split(this ReadOnlyMemory } #endif - if (!value.IsEmpty || - !options.HasFlag(StringSplitOptions.RemoveEmptyEntries)) + if (!options.HasFlag(StringSplitOptions.RemoveEmptyEntries)) { yield return value; } @@ -94,7 +92,7 @@ public static IEnumerable> Split(this ReadOnlyMemory } chars = chars.Slice(i + 1); - } + } while (!chars.IsEmpty); } /// @@ -107,8 +105,7 @@ public static IEnumerable> Split(this ReadOnlyMemory /// Iterator public static IEnumerable> Split(this ReadOnlyMemory chars, char delimiter1, char delimiter2, StringSplitOptions options = StringSplitOptions.None) { - while (!chars.IsEmpty) - { + do { var i = chars.Span.IndexOfAny(delimiter1, delimiter2); if (i < 0) { @@ -124,8 +121,7 @@ public static IEnumerable> Split(this ReadOnlyMemory } #endif - if (!value.IsEmpty || - !options.HasFlag(StringSplitOptions.RemoveEmptyEntries)) + if (!options.HasFlag(StringSplitOptions.RemoveEmptyEntries)) { yield return value; } @@ -136,7 +132,7 @@ public static IEnumerable> Split(this ReadOnlyMemory } chars = chars.Slice(i + 1); - } + } while (!chars.IsEmpty); } /// @@ -148,8 +144,7 @@ public static IEnumerable> Split(this ReadOnlyMemory /// Iterator public static IEnumerable> SplitReverse(this ReadOnlyMemory chars, char delimiter, StringSplitOptions options = StringSplitOptions.None) { - while (!chars.IsEmpty) - { + do { var i = chars.Span.LastIndexOf(delimiter); var value = chars.Slice(i + 1); @@ -161,8 +156,7 @@ public static IEnumerable> SplitReverse(this ReadOnlyMemory } #endif - if (!value.IsEmpty || - !options.HasFlag(StringSplitOptions.RemoveEmptyEntries)) + if (!options.HasFlag(StringSplitOptions.RemoveEmptyEntries)) { yield return value; } @@ -173,7 +167,7 @@ public static IEnumerable> SplitReverse(this ReadOnlyMemory } chars = chars.Slice(0, i); - } + } while (!chars.IsEmpty); } /// @@ -185,8 +179,7 @@ public static IEnumerable> SplitReverse(this ReadOnlyMemory /// Iterator public static IEnumerable> Split(this ReadOnlyMemory chars, ReadOnlyMemory delimiter, StringSplitOptions options = StringSplitOptions.None) { - while (!chars.IsEmpty) - { + do { var i = chars.Span.IndexOf(delimiter.Span); if (i < 0) { @@ -202,8 +195,7 @@ public static IEnumerable> Split(this ReadOnlyMemory } #endif - if (!value.IsEmpty || - !options.HasFlag(StringSplitOptions.RemoveEmptyEntries)) + if (!options.HasFlag(StringSplitOptions.RemoveEmptyEntries)) { yield return value; } @@ -214,7 +206,7 @@ public static IEnumerable> Split(this ReadOnlyMemory } chars = chars.Slice(i + delimiter.Length); - } + } while (!chars.IsEmpty); } /// @@ -226,8 +218,7 @@ public static IEnumerable> Split(this ReadOnlyMemory /// Iterator public static IEnumerable> SplitReverse(this ReadOnlyMemory chars, ReadOnlyMemory delimiter, StringSplitOptions options = StringSplitOptions.None) { - while (!chars.IsEmpty) - { + do { var i = chars.Span.LastIndexOf(delimiter.Span); var value = i >= 0 ? chars.Slice(i + delimiter.Length) : chars; @@ -239,8 +230,7 @@ public static IEnumerable> SplitReverse(this ReadOnlyMemory } #endif - if (!value.IsEmpty || - !options.HasFlag(StringSplitOptions.RemoveEmptyEntries)) + if (!options.HasFlag(StringSplitOptions.RemoveEmptyEntries)) { yield return value; } @@ -251,7 +241,7 @@ public static IEnumerable> SplitReverse(this ReadOnlyMemory } chars = chars.Slice(0, i); - } + } while (!chars.IsEmpty); } /// @@ -264,8 +254,7 @@ public static IEnumerable> SplitReverse(this ReadOnlyMemory /// Iterator public static IEnumerable> Split(this ReadOnlyMemory chars, ReadOnlyMemory delimiter, StringSplitOptions options, StringComparison comparison) { - while (!chars.IsEmpty) - { + do { var i = chars.Span.IndexOf(delimiter.Span, comparison); if (i < 0) { @@ -281,8 +270,7 @@ public static IEnumerable> Split(this ReadOnlyMemory } #endif - if (!value.IsEmpty || - !options.HasFlag(StringSplitOptions.RemoveEmptyEntries)) + if (!options.HasFlag(StringSplitOptions.RemoveEmptyEntries)) { yield return value; } @@ -293,7 +281,7 @@ public static IEnumerable> Split(this ReadOnlyMemory } chars = chars.Slice(i + delimiter.Length); - } + } while (!chars.IsEmpty); } } From f2615f0ad76290c79099fecba85f509de004a8ff Mon Sep 17 00:00:00 2001 From: Erik White Date: Sat, 20 Jan 2024 09:11:43 +0100 Subject: [PATCH 2/2] Restore conditional --- .../Split/SpanSplitExtensions.cs | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/LTRData.Extensions/Split/SpanSplitExtensions.cs b/LTRData.Extensions/Split/SpanSplitExtensions.cs index c8a216a..925c496 100644 --- a/LTRData.Extensions/Split/SpanSplitExtensions.cs +++ b/LTRData.Extensions/Split/SpanSplitExtensions.cs @@ -81,7 +81,8 @@ public static IEnumerable> Split(this ReadOnlyMemory } #endif - if (!options.HasFlag(StringSplitOptions.RemoveEmptyEntries)) + if (!value.IsEmpty || + !options.HasFlag(StringSplitOptions.RemoveEmptyEntries)) { yield return value; } @@ -121,7 +122,8 @@ public static IEnumerable> Split(this ReadOnlyMemory } #endif - if (!options.HasFlag(StringSplitOptions.RemoveEmptyEntries)) + if (!value.IsEmpty || + !options.HasFlag(StringSplitOptions.RemoveEmptyEntries)) { yield return value; } @@ -156,7 +158,8 @@ public static IEnumerable> SplitReverse(this ReadOnlyMemory } #endif - if (!options.HasFlag(StringSplitOptions.RemoveEmptyEntries)) + if (!value.IsEmpty || + !options.HasFlag(StringSplitOptions.RemoveEmptyEntries)) { yield return value; } @@ -195,7 +198,8 @@ public static IEnumerable> Split(this ReadOnlyMemory } #endif - if (!options.HasFlag(StringSplitOptions.RemoveEmptyEntries)) + if (!value.IsEmpty || + !options.HasFlag(StringSplitOptions.RemoveEmptyEntries)) { yield return value; } @@ -230,7 +234,8 @@ public static IEnumerable> SplitReverse(this ReadOnlyMemory } #endif - if (!options.HasFlag(StringSplitOptions.RemoveEmptyEntries)) + if (!value.IsEmpty || + !options.HasFlag(StringSplitOptions.RemoveEmptyEntries)) { yield return value; } @@ -270,7 +275,8 @@ public static IEnumerable> Split(this ReadOnlyMemory } #endif - if (!options.HasFlag(StringSplitOptions.RemoveEmptyEntries)) + if (!value.IsEmpty || + !options.HasFlag(StringSplitOptions.RemoveEmptyEntries)) { yield return value; }