![]() |
VOOZH | about |
dotnet add package Open.Text --version 10.2.0
NuGet\Install-Package Open.Text -Version 10.2.0
<PackageReference Include="Open.Text" Version="10.2.0" />
<PackageVersion Include="Open.Text" Version="10.2.0" />Directory.Packages.props
<PackageReference Include="Open.Text" />Project file
paket add Open.Text --version 10.2.0
#r "nuget: Open.Text, 10.2.0"
#:package Open.Text@10.2.0
#addin nuget:?package=Open.Text&version=10.2.0Install as a Cake Addin
#tool nuget:?package=Open.Text&version=10.2.0Install as a Cake Tool
A set of useful extensions for working with strings, string-segments, spans, enums, and value formatting.
Microsoft.Extensions.Primitives.StringSegments for string manipulation.*NoAlloc methods available in the separate Open.Text.ZLinq package!Comparing string.Split() (BCL) vs SplitAsSegments (IEnumerable) vs SplitAsSegmentsNoAlloc (ValueEnumerable via ZLinq):
| Category | Method | Time | Allocated |
|---|---|---|---|
| Count | BCL Split + LINQ Count | 46.9 ns | 256 B |
| SplitAsSegments + LINQ Count | 61.9 ns | 88 B | |
| SplitAsSegmentsNoAlloc + ZLinq Count | 55.3 ns | 0 B β | |
| LINQ-Chain | SplitAsSegmentsNoAlloc + ZLinq | 50.8 ns | 0 B β |
| BCL + System.Linq | 65.5 ns | 304 B | |
| SplitAsSegments + System.Linq | 104.4 ns | 152 B | |
| Large-Foreach | BCL Split (1000 items) | 7,342 ns | 47,952 B |
| SplitAsSegments (1000 items) | 11,740 ns | 88 B | |
| SplitAsSegmentsNoAlloc (1000 items) | 11,557 ns | 0 B β | |
| Small-Foreach | BCL Split | 42.5 ns | 256 B |
| SplitAsSegmentsNoAlloc | 45.6 ns | 0 B β | |
| SplitAsSegments | 72.4 ns | 88 B | |
| Seq-Split | SplitAsSegmentsNoAlloc(string) | 177.6 ns | 0 B β |
| SplitAsSegments(string) | 215.2 ns | 128 B | |
| BCL Split(string) | 227.1 ns | 696 B |
Key Takeaway: The
SplitAsSegmentsNoAllocmethods achieve zero heap allocations when iteratingStringSegmentvaluesβideal for high-throughput scenarios where GC pressure matters.Note: Regex-based split methods have unavoidable
Matchobject allocations.
For scenarios requiring true zero-allocation string operations, install the companion package:
dotnet add package Open.Text.ZLinq
This package provides *NoAlloc extension methods that return ZLinq ValueEnumerable<TEnumerator, T> structs instead of heap-allocated enumerables. These methods integrate seamlessly with ZLinq for zero-allocation LINQ operations.
SplitAsSegmentsNoAlloc(char) - Split by characterSplitAsSegmentsNoAlloc(string) - Split by string sequenceSplitAsSegmentsNoAlloc(Regex) - Split by regex patternJoinNoAlloc(...) - Join segments with separatorReplaceNoAlloc(...) / ReplaceAsSegmentsNoAlloc(...) - Replace sequencesAsSegmentsNoAlloc(Regex) - Get regex matches as segmentsusing Open.Text;
using ZLinq;
// Zero-allocation split and filter
var count = "a,b,c,d,e"
.SplitAsSegmentsNoAlloc(',')
.Where(s => s.Length > 0)
.Count(); // No heap allocations!
Open.Text now includes Roslyn analyzers that help you write more efficient code by detecting common string manipulation anti-patterns and suggesting better alternatives using spans and string segments.
dotnet add package Open.Text.Analyzers
The analyzers detect patterns like:
.Substring() β suggests .AsSpan() or span slicing.Split() β suggests .SplitAsSegments() or .SplitToEnumerable() to reduce allocations.Split()[0] β suggests .FirstSplit() to avoid array allocationStringBuilder.Trim().Equals() β suggests .TrimEquals() to avoid intermediate stringSee the for complete documentation.
ReadOnlySpan<char> Capture.AsSpan()
Enumerable<StringSegment> Regex.AsSegments(string input)
string GroupCollection.GetValue(string groupName)
ReadOnlySpan<char> GroupCollection.GetValueSpan(string groupName)
IEnumerable<StringSegment> string.Split(Regex pattern)
Optimized .Equals(...) extension methods for comparing spans and strings.
SplitToEnumerableReturns each string segment of the split through an enumerable instead of all at once in an array.
SplitAsMemoryProduces an enumerable where each segment is yielded as a ReadOnlyMemory<char>.
SplitAsSegmentProduces an enumerable where each segment is yielded as a StringSegment.
TrimStartPattern & TrimEndPatternSimilar to their character trimming counterparts, these methods can trim sequences of characters or regular expression patterns.
StringBuilder ExtensionsExtensions for:
StringBuilder.StringSegment ExtensionsExtensions for:
.Trim(char) and .Trim(ReadOnlySpan<char>).StringComparable & SpanComparable Extensionsif(myString.AsCaseInsensitive()=="HELLO!") { }
instead of
if(myString.Equals("HELLO!", StringComparison.OrdinalIgnoreCase)) { }
EnumValue<TEnum> & EnumValueIgnoreCase<TEnum>Implicit conversion makes it easy. Optimized methods make it fast.
Consider the following:
enum Greek { Alpha, Beta, Gamma }
void DoSomethingWithGreek(Greek value) { }
DoSomethingWithGreek(Greek.Alpha);
It's nice that Greek is an enum because it won't be null, and it has to be one of the values.
But what if you want to write a single function that will take an Greek or a string?
This gets problematic as the string value has to be parsed and you'll likely need an overload.
EnumValue<TEnum> solves this problem:
enum Greek { Alpha, Beta, Gamma }
void DoSomethingWithGreek(EnumValue<Greek> value) { }
// Both work fine.
DoSomethingWithGreek("Alpha");
DoSomethingWithGreek(Greek.Alpha);
// Throws an ArgumentException:
DoSomethingWithGreek("Theta");
The implicit conversion between a string and EnumValue<TEnum> make this possible.
If you need to allow for case-insensitive comparison then simply use EnumValueCaseIgnored<TEnum> instead.
The performance is outstanding as it uses the length of the names to build a tree in order to parse values and uses an expression tree instead of calling .ToString() on the value.
string.Supplant(...)An alternative to String.Format that takes an array of values.
string.ReplaceWhiteSpace(...)A shortcut for replacing whitespace with a Regex.
string.ToMetricString(...)Returns an abbreviated metric representation of a number.
ToByteString(...)Returns an abbreviated metric representation of a quantity of bytes.
ToPercentString(...)Shortcut for formating to a percent.
ToNullIfWhiteSpace()Allows for simple null operators if a string is empty or whitespace.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 net5.0 was computed. net5.0-windows net5.0-windows was computed. net6.0 net6.0 is compatible. net6.0-android net6.0-android was computed. net6.0-ios net6.0-ios was computed. net6.0-maccatalyst net6.0-maccatalyst was computed. net6.0-macos net6.0-macos was computed. net6.0-tvos net6.0-tvos was computed. net6.0-windows net6.0-windows was computed. net7.0 net7.0 was computed. net7.0-android net7.0-android was computed. net7.0-ios net7.0-ios was computed. net7.0-maccatalyst net7.0-maccatalyst was computed. net7.0-macos net7.0-macos was computed. net7.0-tvos net7.0-tvos was computed. net7.0-windows net7.0-windows was computed. net8.0 net8.0 is compatible. net8.0-android net8.0-android was computed. net8.0-browser net8.0-browser was computed. net8.0-ios net8.0-ios was computed. net8.0-maccatalyst net8.0-maccatalyst was computed. net8.0-macos net8.0-macos was computed. net8.0-tvos net8.0-tvos was computed. net8.0-windows net8.0-windows was computed. net9.0 net9.0 was computed. net9.0-android net9.0-android was computed. net9.0-browser net9.0-browser was computed. net9.0-ios net9.0-ios was computed. net9.0-maccatalyst net9.0-maccatalyst was computed. net9.0-macos net9.0-macos was computed. net9.0-tvos net9.0-tvos was computed. net9.0-windows net9.0-windows was computed. net10.0 net10.0 is compatible. net10.0-android net10.0-android was computed. net10.0-browser net10.0-browser was computed. net10.0-ios net10.0-ios was computed. net10.0-maccatalyst net10.0-maccatalyst was computed. net10.0-macos net10.0-macos was computed. net10.0-tvos net10.0-tvos was computed. net10.0-windows net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 netcoreapp2.0 was computed. netcoreapp2.1 netcoreapp2.1 was computed. netcoreapp2.2 netcoreapp2.2 was computed. netcoreapp3.0 netcoreapp3.0 was computed. netcoreapp3.1 netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 netstandard2.0 is compatible. netstandard2.1 netstandard2.1 is compatible. |
| .NET Framework | net461 net461 was computed. net462 net462 was computed. net463 net463 was computed. net47 net47 was computed. net471 net471 was computed. net472 net472 was computed. net48 net48 was computed. net481 net481 was computed. |
| MonoAndroid | monoandroid monoandroid was computed. |
| MonoMac | monomac monomac was computed. |
| MonoTouch | monotouch monotouch was computed. |
| Tizen | tizen40 tizen40 was computed. tizen60 tizen60 was computed. |
| Xamarin.iOS | xamarinios xamarinios was computed. |
| Xamarin.Mac | xamarinmac xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos xamarinwatchos was computed. |
Showing the top 3 NuGet packages that depend on Open.Text:
| Package | Downloads |
|---|---|
|
Open.Collections
Useful set of collections, and extensions for collections with thread-safe read-write access options. Part of the "Open" set of libraries. |
|
|
Open.DateTime.Extensions
Simple set of DateTime extensions extensions. Code savers like: .Delta(time?) |
|
|
Open.Text.ZLinq
Zero-allocation extensions for Open.Text using ZLinq. Provides SplitAsSegmentsNoAlloc and other high-performance string operations that avoid heap allocations via ZLinq's ValueEnumerable. Part of the "Open" set of libraries. |
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 10.2.0 | 10,076 | 2/20/2026 |
| 10.1.0 | 3,465 | 2/7/2026 |
| 10.0.2 | 1,277 | 2/1/2026 |
| 10.0.1 | 188 | 1/31/2026 |
| 10.0.0 | 135 | 1/31/2026 |
| 9.0.1 | 8,268 | 11/13/2025 |
| 9.0.0 | 40,663 | 11/16/2024 |
| 8.2.1 | 367 | 11/16/2024 |
| 8.2.0 | 279 | 11/16/2024 |
| 8.1.0 | 3,134 | 8/28/2024 |
| 8.0.0 | 4,672 | 7/28/2024 |
| 7.0.3 | 5,631 | 7/12/2024 |
| 7.0.2 | 279 | 7/12/2024 |
| 7.0.1 | 563 | 6/26/2024 |
| 7.0.0 | 2,623 | 2/24/2024 |
| 7.0.0-beta | 216 | 2/24/2024 |
| 6.7.0 | 2,582 | 11/8/2023 |
| 6.6.4 | 3,620 | 6/12/2023 |
| 6.6.3 | 348 | 6/2/2023 |
| 6.6.2 | 3,932 | 5/5/2023 |
Added case conversion extensions for StringSegment.