PersistentCollection 2.2.1
dotnet add package PersistentCollection --version 2.2.1
NuGet\Install-Package PersistentCollection -Version 2.2.1
<PackageReference Include="PersistentCollection" Version="2.2.1" />
<PackageVersion Include="PersistentCollection" Version="2.2.1" />
<PackageReference Include="PersistentCollection" />
paket add PersistentCollection --version 2.2.1
#r "nuget: PersistentCollection, 2.2.1"
#:package PersistentCollection@2.2.1
#addin nuget:?package=PersistentCollection&version=2.2.1
#tool nuget:?package=PersistentCollection&version=2.2.1
PersistentCollection
Lightweight, persistent, thread-safe, disk-based collection classes written in C# for queue, stack, dictionary, and list. All classes leverage a file to enable persistence across instantiations of the object or restarts of the software.
IMPORTANT:
- To provide persistence, the internal data structure is persisted to disk in full any time a change is made
- Thus, this library is NOT APPROPRIATE for large amounts of data or a large number of records
- It is recommended that these classes be used sparingly, when record counts are less than 1000 and total size is less than 10MB
New in v2.2.x
- Built-in observability: metrics and traces via
System.DiagnosticsMeterandActivitySource, both namedPersistentCollection(no exporter dependency, near-zero cost when nothing is listening) - Operation latency and outcome, lock wait, disk persistence latency and file size, queue/stack depth, and errors by type
- See TELEMETRY.md for the full metrics and spans catalog, subscription examples, and recommended alerts
- v2.2.1: dependency updates (
SerializationHelper2.1.0,System.Text.Json10.0.12); no public API changes
New in v2.0.x
- Remove expiration
- Migrate existing implementation to
PersistentList,PersistentQueue,PersistentDictionary, andPersistentStack - Rename package to
PersistentCollection
Getting Started
Refer to the Test project for a working example.
PersistentList
PersistentList implements the interface of System.Collections.Generic.List<T>.
using PersistentCollection;
PersistentList<string> myList = new PersistentList<string>("./list.idx");
myList.Add("foo");
myList.Add("bar");
string val = myList.Get(1);
myList.RemoveAt(1);
PersistentQueue
PersistentQueue mimics the behavior of System.Collections.Generic.Queue<T>.
using PersistentCollection;
PersistentQueue<string> myQueue = new PersistentQueue<string>("./queue.idx");
myQueue.Enqueue("foo");
myQueue.Enqueue("bar");
string val = myQueue.Dequeue(); // foo
PersistentStack
PersistentStack mimics the behavior of System.Collections.Generic.Stack<T>.
using PersistentCollection;
PersistentStack<string> myStack = new PersistentStack<string>("./stack.idx");
myStack.Push("foo");
myStack.Push("bar");
string val = myStack.Pop(); // bar
PersistentDictionary
PersistentDictionary implements the interface of System.Collections.Generic.IDictionary<TKey, TValue>.
using PersistentCollection;
PersistentDictionary<string, string> myDict = new PersistentDictionary<string, string>("./dict.idx");
myDict.Add("name", "Joel");
myDict.Add("hobbies", "code");
string val = myDict["name"]; // Joel
Observability
PersistentCollection emits OpenTelemetry-compatible metrics and traces through the BCL System.Diagnostics APIs. It takes no dependency on any exporter. Subscribe your host's collector to the PersistentCollection meter and activity source, for example with Radiant:
using PersistentCollection;
settings.Sources.AddMeter(PersistentCollectionTelemetry.MeterName);
settings.Sources.AddActivitySource(PersistentCollectionTelemetry.ActivitySourceName);
Or with the OpenTelemetry SDK: .AddMeter(PersistentCollectionTelemetry.MeterName) and .AddSource(PersistentCollectionTelemetry.ActivitySourceName).
You then get, for example:
persistentcollection_operation_duration_secondsper collection type, operation, and outcomepersistentcollection_persistence_duration_secondsandpersistentcollection_persistence_size_bytes, which show the cost of each full-file rewritepersistentcollection_items(queue and stack depth) andpersistentcollection_errors_totalbyerror_type- spans such as
PersistentQueue enqueue→PersistentQueue persistence.write, which nest under your request or job span
Refer to TELEMETRY.md for the complete catalog, PromQL alerts, and suggested dashboard panels.
Version History
Refer to CHANGELOG.md for version history.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 is compatible. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 is compatible. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETFramework 4.8
- SerializationHelper (>= 2.1.0)
- System.Diagnostics.DiagnosticSource (>= 10.0.12)
- System.Text.Json (>= 10.0.12)
-
.NETStandard 2.0
- SerializationHelper (>= 2.1.0)
- System.Diagnostics.DiagnosticSource (>= 10.0.12)
- System.Text.Json (>= 10.0.12)
-
.NETStandard 2.1
- SerializationHelper (>= 2.1.0)
- System.Diagnostics.DiagnosticSource (>= 10.0.12)
- System.Text.Json (>= 10.0.12)
-
net8.0
- SerializationHelper (>= 2.1.0)
- System.Diagnostics.DiagnosticSource (>= 10.0.12)
- System.Text.Json (>= 10.0.12)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on PersistentCollection:
| Package | Downloads |
|---|---|
|
SwiftStack
SwiftStack is an opinionated and easy way to build REST APIs, websockets APIs, and RabbitMQ interfaces, taking inspiration from the elegant model shown in FastAPI in Python. Built on Watson webserver. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 2.2.1 | 40 | 10/3/2026 |
| 2.2.0 | 47 | 10/3/2026 |
| 2.1.0 | 175 | 8/16/2026 |
| 2.0.12 | 6,017 | 4/7/2025 |
| 2.0.11 | 269 | 4/7/2025 |
| 2.0.10 | 253 | 4/7/2025 |
| 2.0.9 | 264 | 4/7/2025 |
| 2.0.8 | 277 | 4/7/2025 |
| 2.0.7 | 187 | 4/5/2025 |
| 2.0.6 | 195 | 4/5/2025 |
| 2.0.4 | 263 | 4/3/2025 |
| 2.0.3 | 266 | 4/3/2025 |
| 2.0.2 | 246 | 4/3/2025 |
| 2.0.1 | 261 | 4/2/2025 |
| 2.0.0 | 252 | 4/2/2025 |
Dependency updates: SerializationHelper 2.1.0, System.Text.Json 10.0.12. Built-in OpenTelemetry-compatible metrics and traces via System.Diagnostics Meter and ActivitySource named PersistentCollection. See TELEMETRY.md.