CLSS.Constants.CollectionPool 1.1.0

dotnet add package CLSS.Constants.CollectionPool --version 1.1.0
NuGet\Install-Package CLSS.Constants.CollectionPool -Version 1.1.0
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="CLSS.Constants.CollectionPool" Version="1.1.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add CLSS.Constants.CollectionPool --version 1.1.0
#r "nuget: CLSS.Constants.CollectionPool, 1.1.0"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install CLSS.Constants.CollectionPool as a Cake Addin
#addin nuget:?package=CLSS.Constants.CollectionPool&version=1.1.0

// Install CLSS.Constants.CollectionPool as a Cake Tool
#tool nuget:?package=CLSS.Constants.CollectionPool&version=1.1.0

CLSS.Constants.CollectionPool

Problem

In many real-world situations, the most straight-forward way to solve a problem is to construct a temporary collection to hold your elements. However, since the creation of a new collection on the fly costs an allocation for the collection itself, hot code paths usually have a persistent collection as a class field to avoid this allocation. This not only puts bloat on a class source file by mixing data fields with reuse-able collections, it can also cost more memory space than necessary when a large number of objects have persistent collection field but only a few objects actually make use of their persistent collection fields at any given moment.

While .NET Standard 2.1 shipped with the ArrayPool<T> class, the inflexibility of arrays makes it unsuitable for many situations.

Solution

Inspired by the ArrayPool<T> class, this package provides global pools of BCL collection types under the System.Collections.Generic namespace up to what is contained in .NET Standard 2.0. This means the following collection types are pooled:

The type of the pools themselves are AgnosticObjectPool - this package's only dependency. Their available instance predicate function is a check for emptiness. Since AgnosticObjectPool does not formally have a mechanism for manual releasing of pooled instances and only checks for availability on-demand, you have to mark a pooled collection instance as "available" again after you are done using it by emptying it.

The type parameters for the pooled collections are passed through the CollectionPool class.

using CLSS;

SortedSet<int> sortedUniqueIDs = CollectionPool<int>.SortedSet.TakeOne();
foreach (int id in bookAuthorIDs) sortedUniqueIDs.Add(id);
[...] // Do something with sortedUniqueIDs
// The pool can now give this SortedSet instance to another code path
sortedUniqueIDs.Clear();

Dictionary<int, SteerAgent> neighbours
  = CollectionPool<int, SteerAgent>.Dictionary.TakeOne();
// out parameter is another good use-case for pooled collections
PollForNeighbours(out neighbours);
[...] // Do something with neighbours
neighbours.Clear();

The pools provided by this package have the initial size of 0 and a grow step of 1. Since AgnosticObjectPool has all of its fields and methods public, you can manually pre-grow them and set a different grow step at runtime, should you need to.

The .NET Standard 1.0 assembly of this package does not contain a pool for SortedList. The lowest .NET Standard version that supports SortedList is 1.3. Hence this package provides an extra assembly for .NET Standard 1.3 which does contain a pool for SortedList.

This package is a part of the C# Language Syntactic Sugar suite.
Product 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 was computed.  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. 
.NET Core netcoreapp1.0 was computed.  netcoreapp1.1 was computed.  netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard1.0 is compatible.  netstandard1.1 was computed.  netstandard1.2 was computed.  netstandard1.3 is compatible.  netstandard1.4 was computed.  netstandard1.5 was computed.  netstandard1.6 was computed.  netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net45 was computed.  net451 was computed.  net452 was computed.  net46 was computed.  net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen30 was computed.  tizen40 was computed.  tizen60 was computed. 
Universal Windows Platform uap was computed.  uap10.0 was computed. 
Windows Phone wp8 was computed.  wp81 was computed.  wpa81 was computed. 
Windows Store netcore was computed.  netcore45 was computed.  netcore451 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.1.0 236 2/16/2024

- Updated package dependency.