DotPrimitives.Collections
4.1.0
See the version list below for details.
dotnet add package DotPrimitives.Collections --version 4.1.0
NuGet\Install-Package DotPrimitives.Collections -Version 4.1.0
<PackageReference Include="DotPrimitives.Collections" Version="4.1.0" />
<PackageVersion Include="DotPrimitives.Collections" Version="4.1.0" />
<PackageReference Include="DotPrimitives.Collections" />
paket add DotPrimitives.Collections --version 4.1.0
#r "nuget: DotPrimitives.Collections, 4.1.0"
#:package DotPrimitives.Collections@4.1.0
#addin nuget:?package=DotPrimitives.Collections&version=4.1.0
#tool nuget:?package=DotPrimitives.Collections&version=4.1.0
DotPrimitives.Collections
A collection primitives library for .NET that adds new Collection types and making it easier to work with existing ones (like IGrouping<TKey, TElement>).
Primitives Included
CachedEnumerable- Caches anIEnumerable's values for inexpensive re-use when required, and allows specifying when materialization should occur.RefreshableCachedEnumerable- LikeCachedEnumerable, but allows cache invalidation and updating the cache.GroupingEnumerable<TKey, TElement>- Deferred grouping of a sequence by key without intermediate collections.GroupingCollection<TKey, TElement>- A read-only, enumerated collection of elements grouped by a common key.FlexibleKeyValuePair<TKey, TValue>- A key-value pair where the key is immutable but the value can be modified.
Getting Started
Compatibility
DotPrimitives.Collections supports a wide range of .NET versions:
- .NET Standard 2.0
- .NET 8
- .NET 9
- .NET 10
Installation
You can install the library via NuGet or using the .NET CLI.
dotnet add package DotPrimitives.Collections
Usage
CachedEnumerable
CachedEnumerable is useful when you want to ensure an IEnumerable is only evaluated once, even if it's requested multiple times.
using DotPrimitives.Collections.Enumerables.Cached;
IEnumerable<int> slowSource = GetSlowEnumerable(); // e.g., from a database or API
CachedEnumerable<int> cached = new CachedEnumerable<int>(slowSource);
// First enumeration - evaluates slowSource
foreach (var item in cached) { /* ... */ }
// Subsequent enumerations - uses cached results without re-evaluating slowSource
foreach (var item in cached) { /* ... */ }
RefreshableCachedEnumerable
RefreshableCachedEnumerable allows you to refresh the cache when the underlying data source has changed.
using DotPrimitives.Collections.Enumerables.Cached;
var source = GetSource();
var refreshable = new RefreshableCachedEnumerable<int>(source);
// Use the cached data
foreach (var x in refreshable) { /* ... */ }
// Update the source and refresh the cache
source = GetUpdatedSource();
refreshable.RefreshCache(source);
// Subsequent enumerations will now use the new data
foreach (var x in refreshable) { /* ... */ }
GroupingEnumerable
GroupingEnumerable provides a way to group elements from a sequence without creating intermediate collections, which is more memory-efficient for large datasets.
using DotPrimitives.Collections.Groupings;
var items = new[] { ("a", 1), ("b", 2), ("a", 3) };
GroupingEnumerable<string,(string,int)> groups = new(
items.Item2, items
);
foreach (var group in groups)
{
Console.WriteLine($"Key: {group.Key}");
foreach (var value in group)
{
Console.WriteLine($" {value}");
}
}
License
DotPrimitives.Collections is licensed under the MIT licence.
See LICENSE.txt for more information.
Acknowledgements
Thanks to the following projects for their great work:
- Polyfill for simplifying .NET Standard 2.0 support
- Microsoft's Microsoft.Bcl.HashCode for providing a backport of the HashCode class and static methods to .NET Standard 2.0
| 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 is compatible. 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 is compatible. 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 was computed. |
| .NET Framework | 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 | 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. |
-
.NETStandard 2.0
- Microsoft.Bcl.Hashcode (>= 6.0.0)
-
net10.0
- No dependencies.
-
net8.0
- No dependencies.
-
net9.0
- No dependencies.
NuGet packages (2)
Showing the top 2 NuGet packages that depend on DotPrimitives.Collections:
| Package | Downloads |
|---|---|
|
EnhancedLinq.Memory
LINQ style Immediate enumeration mode extension methods for Spans and Memory. |
|
|
EnhancedLinq.MsExtensions
LINQ style Deferred and Immediate enumeration mode extension methods for StringSegments and potentially other Microsoft.Extension.* packages in the future . |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 4.3.0-preview.2 | 35 | 1/19/2026 |
| 4.1.0 | 316 | 12/22/2025 |
* Shortened package namespace and package Id