Ecng.Collections 1.0.270

There is a newer version of this package available.
See the version list below for details.
dotnet add package Ecng.Collections --version 1.0.270
                    
NuGet\Install-Package Ecng.Collections -Version 1.0.270
                    
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="Ecng.Collections" Version="1.0.270" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Ecng.Collections" Version="1.0.270" />
                    
Directory.Packages.props
<PackageReference Include="Ecng.Collections" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Ecng.Collections --version 1.0.270
                    
#r "nuget: Ecng.Collections, 1.0.270"
                    
#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.
#:package Ecng.Collections@1.0.270
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Ecng.Collections&version=1.0.270
                    
Install as a Cake Addin
#tool nuget:?package=Ecng.Collections&version=1.0.270
                    
Install as a Cake Tool

Ecng.Collections

Thread-safe collections, specialized data structures, and collection utilities for high-performance scenarios.

Thread-Safe Collections

All synchronized collections provide thread-safe operations with internal locking.

SynchronizedDictionary

Thread-safe wrapper around Dictionary<TKey, TValue>.

var dict = new SynchronizedDictionary<int, string>();

// Thread-safe operations
dict[1] = "one";
dict.Add(2, "two");

if (dict.TryGetValue(1, out var value))
    Console.WriteLine(value); // "one"

// Manual locking for compound operations
using (dict.EnterScope())
{
    if (!dict.ContainsKey(3))
        dict.Add(3, "three");
}

SynchronizedList

Thread-safe list with notification support.

var list = new SynchronizedList<string>();

list.Add("item1");
list.AddRange(new[] { "item2", "item3" });

// Safe iteration with scope
using (list.EnterScope())
{
    foreach (var item in list)
        Console.WriteLine(item);
}

CachedSynchronizedList

Thread-safe list that caches its array representation for fast enumeration.

var list = new CachedSynchronizedList<int>();

list.Add(1);
list.Add(2);
list.Add(3);

// Cache is computed once and reused until list changes
int[] cached = list.Cache;
foreach (var item in cached)
    Console.WriteLine(item);

// After modification, cache is invalidated
list.Add(4);
int[] newCache = list.Cache; // Recomputed

CachedSynchronizedDictionary

Thread-safe dictionary with cached key/value arrays.

var dict = new CachedSynchronizedDictionary<string, int>();

dict["a"] = 1;
dict["b"] = 2;

// Cached arrays for fast iteration
string[] keys = dict.CachedKeys;
int[] values = dict.CachedValues;
KeyValuePair<string, int>[] pairs = dict.CachedPairs;

SynchronizedSet

Thread-safe HashSet<T> wrapper.

var set = new SynchronizedSet<int>();

set.Add(1);
set.Add(2);
bool added = set.Add(1); // false, already exists

bool contains = set.Contains(1); // true

Specialized Collections

PairSet - Bidirectional Dictionary

Allows lookup by both key and value.

var pairs = new PairSet<int, string>();

pairs.Add(1, "one");
pairs.Add(2, "two");

// Forward lookup (key -> value)
string value = pairs.GetValue(1); // "one"

// Reverse lookup (value -> key)
int key = pairs.GetKey("two"); // 2

// Check existence
bool hasKey = pairs.ContainsKey(1);
bool hasValue = pairs.ContainsValue("one");

// Remove by value
pairs.RemoveByValue("one");

SynchronizedPairSet

Thread-safe version of PairSet.

var pairs = new SynchronizedPairSet<Guid, string>();

var id = Guid.NewGuid();
pairs.Add(id, "session-1");

// Thread-safe bidirectional lookup
if (pairs.TryGetValue(id, out var session))
    Console.WriteLine(session);

if (pairs.TryGetKey("session-1", out var foundId))
    Console.WriteLine(foundId);

CircularBuffer

Fixed-size buffer that overwrites oldest elements when full.

var buffer = new CircularBuffer<int>(capacity: 3);

buffer.PushBack(1);
buffer.PushBack(2);
buffer.PushBack(3);
// Buffer: [1, 2, 3]

buffer.PushBack(4);
// Buffer: [2, 3, 4] - oldest (1) was overwritten

int front = buffer.Front(); // 2
int back = buffer.Back();   // 4
int second = buffer[1];     // 3

// Remove from ends
buffer.PopFront(); // Removes 2
buffer.PopBack();  // Removes 4

// Convert to array
int[] arr = buffer.ToArray();

// Resize buffer
buffer.Capacity = 5; // Grow
buffer.Capacity = 2; // Shrink (keeps newest elements)

CircularBufferEx

Extended circular buffer with additional operations.

var buffer = new CircularBufferEx<decimal>(100);

// Add elements
buffer.PushBack(1.5m);
buffer.PushBack(2.5m);

// Sum, min, max operations
decimal sum = buffer.Sum;
decimal min = buffer.Min;
decimal max = buffer.Max;

NumericCircularBufferEx

Circular buffer optimized for numeric calculations with running statistics.

var buffer = new NumericCircularBufferEx<double>(100);

for (int i = 0; i < 100; i++)
    buffer.PushBack(Math.Sin(i));

// Efficient statistics (computed incrementally)
double sum = buffer.Sum;
double min = buffer.Min;
double max = buffer.Max;

Queue and Stack Extensions

SynchronizedQueue

Thread-safe queue.

var queue = new SynchronizedQueue<Message>();

queue.Enqueue(new Message("hello"));

if (queue.TryDequeue(out var msg))
    Process(msg);

SynchronizedStack

Thread-safe stack.

var stack = new SynchronizedStack<int>();

stack.Push(1);
stack.Push(2);

if (stack.TryPop(out var value))
    Console.WriteLine(value); // 2

QueueEx / StackEx

Extended queue and stack with additional peek operations.

var queue = new QueueEx<int>();
queue.Enqueue(1);
queue.Enqueue(2);
queue.Enqueue(3);

int first = queue.PeekFirst();  // 1 (front)
int last = queue.PeekLast();    // 3 (back)

Ordered Channels

BaseOrderedChannel

Base class for ordered message processing with channels.

// Used for ordered async message processing
// See ChannelExtensions for usage patterns

Bit Array Operations

BitArrayWriter / BitArrayReader

Efficient bit-level I/O for binary data.

// Writing bits
var writer = new BitArrayWriter();
writer.Write(true);           // 1 bit
writer.Write(42, 8);          // 8 bits
writer.WriteInt(1000);        // Variable-length int

byte[] data = writer.ToArray();

// Reading bits
var reader = new BitArrayReader(data);
bool flag = reader.Read();     // 1 bit
int value = reader.Read(8);    // 8 bits
int number = reader.ReadInt(); // Variable-length int

Collection Interfaces

INotifyList

List that raises events on modifications.

public interface INotifyList<T> : IList<T>
{
    event Action<T> Adding;
    event Action<T> Added;
    event Action<T> Removing;
    event Action<T> Removed;
    event Action Clearing;
    event Action Cleared;
    event Action Changed;
}

ISynchronizedCollection

Interface for thread-safe collections.

public interface ISynchronizedCollection<T> : ICollection<T>
{
    SyncObject SyncRoot { get; }
    LockScope EnterScope();
}

Extension Methods

using Ecng.Collections;

// Check if collection is empty
IEnumerable<int> items = GetItems();
if (items.IsEmpty())
    return;

// Safe first/last
var first = items.FirstOr(defaultValue: -1);
var last = items.LastOr(defaultValue: -1);

// Batch processing
foreach (var batch in items.Batch(100))
    ProcessBatch(batch);

// Index lookup
int index = items.IndexOf(x => x > 10);

NuGet

Install-Package Ecng.Collections
Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 is compatible.  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.  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 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (8)

Showing the top 5 NuGet packages that depend on Ecng.Collections:

Package Downloads
Ecng.Reflection

Ecng system framework

Ecng.Security

Ecng system framework

Ecng.StringSearch

Ecng system framework

Ecng.Roslyn

Ecng system framework

Ecng.Backup.Mega

Ecng system framework

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.0.279 0 1/18/2026
1.0.278 0 1/18/2026
1.0.277 441 1/14/2026
1.0.276 453 1/13/2026
1.0.275 478 1/13/2026
1.0.274 1,198 1/9/2026
1.0.273 876 1/9/2026
1.0.272 3,374 1/4/2026
1.0.271 2,259 12/30/2025
1.0.270 793 12/29/2025
1.0.269 1,216 12/26/2025
1.0.268 801 12/26/2025
1.0.267 783 12/26/2025
1.0.266 800 12/26/2025
1.0.265 857 12/25/2025
1.0.264 874 12/25/2025
1.0.263 1,371 12/22/2025
1.0.262 875 12/21/2025
1.0.261 942 12/19/2025
1.0.260 902 12/19/2025
1.0.259 8,694 12/17/2025
1.0.258 23,275 12/15/2025
1.0.257 23,185 12/15/2025
1.0.256 29,439 12/14/2025
1.0.255 50,260 12/12/2025
1.0.254 49,575 12/12/2025
1.0.253 49,184 12/12/2025
1.0.252 49,187 12/12/2025
1.0.251 49,926 12/12/2025
1.0.250 113,077 12/2/2025
1.0.249 113,306 12/2/2025
1.0.248 114,078 12/2/2025
1.0.247 129,658 11/30/2025
1.0.246 132,643 11/29/2025
1.0.245 134,822 11/28/2025
1.0.244 135,522 11/28/2025
1.0.243 139,342 11/27/2025
1.0.242 159,076 11/24/2025
1.0.241 160,826 11/24/2025
1.0.240 165,591 11/23/2025
1.0.239 171,012 11/22/2025
1.0.238 189,099 11/20/2025
1.0.237 212,096 11/18/2025
1.0.236 212,772 11/18/2025
1.0.235 255,525 11/13/2025
1.0.234 288,190 11/10/2025
1.0.233 328,849 11/1/2025
1.0.232 328,095 10/28/2025
1.0.231 328,061 10/27/2025
1.0.230 327,926 10/27/2025
1.0.229 327,861 10/25/2025
1.0.228 378,322 10/3/2025
1.0.227 378,399 9/28/2025
1.0.226 378,133 9/25/2025
1.0.225 402,085 8/30/2025
1.0.224 376,625 7/13/2025
1.0.223 368,130 7/13/2025
1.0.222 368,150 7/12/2025
1.0.221 369,409 7/8/2025
1.0.220 368,940 7/4/2025
1.0.219 368,219 7/2/2025
1.0.218 373,101 6/16/2025
1.0.217 368,372 6/9/2025
1.0.216 368,235 6/8/2025
1.0.215 369,878 5/21/2025
1.0.214 368,346 5/17/2025
1.0.213 369,949 5/12/2025
1.0.212 368,265 5/12/2025
1.0.211 370,721 4/17/2025
1.0.210 373,364 3/22/2025
1.0.209 368,233 3/20/2025
1.0.208 368,173 3/20/2025
1.0.207 368,218 3/19/2025
1.0.206 373,399 2/26/2025
1.0.205 368,300 2/26/2025
1.0.204 376,729 2/5/2025
1.0.203 372,222 1/21/2025
1.0.202 371,574 1/14/2025
1.0.201 370,414 1/12/2025
1.0.200 368,860 1/10/2025
1.0.199 372,523 12/27/2024
1.0.198 369,325 11/20/2024
1.0.197 371,810 11/18/2024
1.0.196 370,136 11/7/2024
1.0.195 369,524 10/19/2024
1.0.194 371,384 10/12/2024
1.0.193 371,930 10/5/2024
1.0.192 373,034 9/18/2024
1.0.191 368,321 9/17/2024
1.0.190 372,732 9/3/2024
1.0.189 368,382 9/1/2024
1.0.188 382,491 6/12/2024
1.0.187 371,233 5/28/2024
1.0.186 371,982 5/4/2024
1.0.185 370,665 4/23/2024
1.0.184 369,747 4/21/2024
1.0.183 368,572 4/14/2024
1.0.182 373,937 3/28/2024
1.0.181 368,517 3/17/2024
1.0.180 371,936 2/23/2024
1.0.179 368,538 2/23/2024
1.0.178 371,921 2/18/2024
1.0.177 368,506 2/18/2024
1.0.176 368,584 2/16/2024
1.0.175 370,680 2/13/2024
1.0.174 370,401 2/8/2024
1.0.173 370,864 2/5/2024
1.0.172 368,558 2/4/2024
1.0.171 371,105 1/23/2024
1.0.170 368,673 1/23/2024
1.0.169 370,378 1/12/2024
1.0.168 373,796 1/2/2024
1.0.167 368,892 12/29/2023
1.0.166 387,080 11/12/2023
1.0.165 780,197 11/10/2023
1.0.164 368,858 11/10/2023
1.0.163 779,891 11/9/2023
1.0.162 780,789 11/3/2023
1.0.161 779,723 11/1/2023
1.0.160 779,777 11/1/2023
1.0.159 805,130 9/8/2023
1.0.158 780,201 9/8/2023
1.0.157 780,446 9/3/2023
1.0.156 780,709 8/21/2023
1.0.155 370,117 8/14/2023
1.0.154 781,233 8/10/2023
1.0.153 820,886 6/29/2023
1.0.152 795,303 5/27/2023
1.0.151 369,803 5/21/2023
1.0.150 369,917 5/19/2023
1.0.149 806,293 5/8/2023
1.0.148 786,218 4/21/2023
1.0.147 831,923 4/3/2023
1.0.146 788,386 3/13/2023
1.0.145 800,227 3/6/2023
1.0.144 782,366 2/26/2023
1.0.143 386,301 2/21/2023
1.0.142 370,704 2/20/2023
1.0.141 371,966 2/15/2023
1.0.140 370,720 2/14/2023
1.0.139 814,198 2/9/2023
1.0.138 387,139 2/7/2023
1.0.137 782,246 2/4/2023
1.0.136 802,308 2/2/2023
1.0.135 798,595 1/30/2023
1.0.134 376,742 1/18/2023
1.0.133 825,951 12/30/2022
1.0.132 784,280 12/23/2022
1.0.131 802,710 12/12/2022
1.0.130 805,333 12/4/2022
1.0.129 782,789 12/4/2022
1.0.128 783,538 11/30/2022
1.0.127 371,923 11/29/2022
1.0.126 372,094 11/28/2022
1.0.125 787,015 11/18/2022
1.0.124 810,277 11/11/2022
1.0.123 783,069 11/11/2022
1.0.122 372,161 11/10/2022
1.0.121 783,345 11/5/2022
1.0.120 784,685 11/4/2022
1.0.119 806,791 11/1/2022
1.0.118 807,086 10/16/2022
1.0.117 790,329 9/10/2022
1.0.116 833,902 9/8/2022
1.0.115 783,591 9/8/2022
1.0.114 372,773 9/8/2022
1.0.113 785,933 9/4/2022
1.0.112 462,368 8/24/2022
1.0.111 793,003 8/8/2022
1.0.110 786,666 7/26/2022
1.0.109 783,822 7/26/2022
1.0.108 836,286 7/19/2022
1.0.107 417,823 7/18/2022
1.0.106 377,901 7/8/2022
1.0.105 788,024 6/18/2022
1.0.104 783,843 6/6/2022
1.0.103 880,395 4/30/2022
1.0.102 784,101 4/20/2022
1.0.101 784,151 4/10/2022
1.0.100 784,125 4/7/2022
1.0.99 784,048 4/7/2022
1.0.98 784,235 4/2/2022
1.0.97 384,613 3/29/2022
1.0.96 376,192 3/27/2022
1.0.95 659,315 1/24/2022
1.0.94 943,073 12/29/2021
1.0.93 810,351 12/20/2021
1.0.92 783,769 12/13/2021
1.0.91 839,883 12/6/2021
1.0.90 374,412 12/2/2021
1.0.89 811,471 11/29/2021
1.0.88 810,071 11/22/2021
1.0.87 371,221 11/17/2021
1.0.86 811,900 11/13/2021
1.0.85 374,662 11/10/2021
1.0.84 782,231 11/9/2021
1.0.83 433,793 11/5/2021
1.0.82 783,967 11/4/2021
1.0.81 782,123 11/4/2021
1.0.80 782,037 11/3/2021
1.0.79 782,279 10/30/2021
1.0.78 813,527 10/21/2021
1.0.77 782,707 10/17/2021
1.0.76 843,461 10/14/2021
1.0.75 793,344 10/13/2021
1.0.74 782,295 10/12/2021
1.0.73 813,947 10/11/2021
1.0.72 782,127 10/9/2021
1.0.71 817,303 10/7/2021
1.0.70 819,368 10/7/2021
1.0.69 782,249 10/7/2021
1.0.68 371,384 10/6/2021
1.0.67 782,381 9/28/2021
1.0.66 816,105 9/23/2021
1.0.65 784,002 9/10/2021
1.0.64 782,113 9/9/2021
1.0.63 782,124 9/8/2021
1.0.62 782,247 9/8/2021
1.0.61 813,008 9/6/2021
1.0.60 371,595 8/31/2021
1.0.59 371,370 8/30/2021
1.0.58 815,304 7/31/2021
1.0.57 841,821 7/30/2021
1.0.56 782,586 7/26/2021
1.0.55 871,165 7/5/2021
1.0.54 371,606 7/1/2021
1.0.53 844,691 6/4/2021
1.0.52 872,385 4/26/2021
1.0.51 812,953 4/19/2021
1.0.50 930,964 4/7/2021
1.0.49 812,165 4/3/2021
1.0.48 960,169 3/22/2021
1.0.47 894,028 3/4/2021
1.0.46 815,335 2/26/2021
1.0.45 949,319 2/2/2021
1.0.44 485,788 1/24/2021
1.0.43 372,067 1/24/2021
1.0.42 371,683 1/23/2021
1.0.41 429,107 1/20/2021
1.0.40 782,478 1/20/2021
1.0.39 400,166 1/18/2021
1.0.38 371,646 1/18/2021
1.0.37 809,633 1/16/2021
1.0.36 899,439 12/16/2020
1.0.35 836,908 12/14/2020
1.0.34 814,683 12/9/2020
1.0.33 784,761 12/6/2020
1.0.32 372,070 12/2/2020
1.0.31 782,793 12/2/2020
1.0.30 811,066 12/1/2020
1.0.29 971,390 11/12/2020
1.0.29-atestpub 2,475 11/11/2020
1.0.28 812,083 10/11/2020
1.0.27 893,863 9/9/2020
1.0.26 810,652 9/3/2020
1.0.25 400,384 8/20/2020
1.0.24 866,346 8/9/2020
1.0.23 400,665 7/28/2020
1.0.22 399,616 7/19/2020
1.0.21 426,824 7/6/2020
1.0.20 866,790 6/6/2020
1.0.19 811,826 6/4/2020
1.0.18 428,202 5/29/2020
1.0.17 839,004 5/21/2020
1.0.16 783,617 5/17/2020
1.0.15 837,768 5/12/2020
1.0.14 892,198 5/4/2020
1.0.13 787,700 4/24/2020
1.0.12 790,418 4/22/2020
1.0.11 783,428 4/22/2020
1.0.10 783,449 4/21/2020
1.0.9 812,610 4/18/2020
1.0.8 399,663 4/16/2020
1.0.7 372,476 4/16/2020
1.0.6 805,620 4/15/2020
1.0.5 808,219 4/11/2020
1.0.4 807,106 4/3/2020
1.0.3 371,961 4/1/2020
1.0.2 794,034 3/27/2020
1.0.1 793,070 3/22/2020
1.0.0 375,354 3/22/2020