Ecng.Collections 1.0.262

There is a newer version of this package available.
See the version list below for details.
dotnet add package Ecng.Collections --version 1.0.262
                    
NuGet\Install-Package Ecng.Collections -Version 1.0.262
                    
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.262" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Ecng.Collections" Version="1.0.262" />
                    
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.262
                    
#r "nuget: Ecng.Collections, 1.0.262"
                    
#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.262
                    
#: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.262
                    
Install as a Cake Addin
#tool nuget:?package=Ecng.Collections&version=1.0.262
                    
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 (7)

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.265 0 12/25/2025
1.0.264 0 12/25/2025
1.0.263 778 12/22/2025
1.0.262 753 12/21/2025
1.0.261 890 12/19/2025
1.0.260 844 12/19/2025
1.0.259 1,066 12/17/2025
1.0.258 1,179 12/15/2025
1.0.257 901 12/15/2025
1.0.256 863 12/14/2025
1.0.255 1,964 12/12/2025
1.0.254 1,137 12/12/2025
1.0.253 742 12/12/2025
1.0.252 747 12/12/2025
1.0.251 1,099 12/12/2025
1.0.250 1,424 12/2/2025
1.0.249 1,306 12/2/2025
1.0.248 1,299 12/2/2025
1.0.247 934 11/30/2025
1.0.246 773 11/29/2025
1.0.245 762 11/28/2025
1.0.244 782 11/28/2025
1.0.243 853 11/27/2025
1.0.242 8,051 11/24/2025
1.0.241 9,806 11/24/2025
1.0.240 14,571 11/23/2025
1.0.239 19,983 11/22/2025
1.0.238 38,028 11/20/2025
1.0.237 61,064 11/18/2025
1.0.236 61,744 11/18/2025
1.0.235 104,498 11/13/2025
1.0.234 137,144 11/10/2025
1.0.233 177,825 11/1/2025
1.0.232 177,067 10/28/2025
1.0.231 177,015 10/27/2025
1.0.230 176,905 10/27/2025
1.0.229 176,840 10/25/2025
1.0.228 227,313 10/3/2025
1.0.227 227,370 9/28/2025
1.0.226 227,119 9/25/2025
1.0.225 250,791 8/30/2025
1.0.224 225,589 7/13/2025
1.0.223 217,113 7/13/2025
1.0.222 217,130 7/12/2025
1.0.221 218,359 7/8/2025
1.0.220 217,914 7/4/2025
1.0.219 217,190 7/2/2025
1.0.218 222,079 6/16/2025
1.0.217 217,347 6/9/2025
1.0.216 217,220 6/8/2025
1.0.215 218,861 5/21/2025
1.0.214 217,323 5/17/2025
1.0.213 218,939 5/12/2025
1.0.212 217,254 5/12/2025
1.0.211 219,696 4/17/2025
1.0.210 222,334 3/22/2025
1.0.209 217,222 3/20/2025
1.0.208 217,168 3/20/2025
1.0.207 217,208 3/19/2025
1.0.206 222,361 2/26/2025
1.0.205 217,286 2/26/2025
1.0.204 225,701 2/5/2025
1.0.203 221,207 1/21/2025
1.0.202 220,559 1/14/2025
1.0.201 219,400 1/12/2025
1.0.200 217,833 1/10/2025
1.0.199 221,493 12/27/2024
1.0.198 218,305 11/20/2024
1.0.197 220,791 11/18/2024
1.0.196 219,118 11/7/2024
1.0.195 218,507 10/19/2024
1.0.194 220,363 10/12/2024
1.0.193 220,917 10/5/2024
1.0.192 222,025 9/18/2024
1.0.191 217,304 9/17/2024
1.0.190 221,720 9/3/2024
1.0.189 217,368 9/1/2024
1.0.188 231,465 6/12/2024
1.0.187 220,202 5/28/2024
1.0.186 220,953 5/4/2024
1.0.185 219,636 4/23/2024
1.0.184 218,718 4/21/2024
1.0.183 217,553 4/14/2024
1.0.182 222,903 3/28/2024
1.0.181 217,492 3/17/2024
1.0.180 220,914 2/23/2024
1.0.179 217,520 2/23/2024
1.0.178 220,900 2/18/2024
1.0.177 217,494 2/18/2024
1.0.176 217,574 2/16/2024
1.0.175 219,664 2/13/2024
1.0.174 219,388 2/8/2024
1.0.173 219,832 2/5/2024
1.0.172 217,547 2/4/2024
1.0.171 220,083 1/23/2024
1.0.170 217,642 1/23/2024
1.0.169 219,358 1/12/2024
1.0.168 222,783 1/2/2024
1.0.167 217,871 12/29/2023
1.0.166 236,057 11/12/2023
1.0.165 629,178 11/10/2023
1.0.164 217,829 11/10/2023
1.0.163 628,873 11/9/2023
1.0.162 629,769 11/3/2023
1.0.161 628,711 11/1/2023
1.0.160 628,772 11/1/2023
1.0.159 654,115 9/8/2023
1.0.158 629,190 9/8/2023
1.0.157 629,435 9/3/2023
1.0.156 629,696 8/21/2023
1.0.155 219,106 8/14/2023
1.0.154 630,214 8/10/2023
1.0.153 669,863 6/29/2023
1.0.152 644,293 5/27/2023
1.0.151 218,799 5/21/2023
1.0.150 218,900 5/19/2023
1.0.149 655,285 5/8/2023
1.0.148 635,217 4/21/2023
1.0.147 680,902 4/3/2023
1.0.146 637,385 3/13/2023
1.0.145 649,223 3/6/2023
1.0.144 631,352 2/26/2023
1.0.143 235,281 2/21/2023
1.0.142 219,695 2/20/2023
1.0.141 220,960 2/15/2023
1.0.140 219,703 2/14/2023
1.0.139 663,193 2/9/2023
1.0.138 236,122 2/7/2023
1.0.137 631,217 2/4/2023
1.0.136 651,289 2/2/2023
1.0.135 647,573 1/30/2023
1.0.134 225,718 1/18/2023
1.0.133 674,946 12/30/2022
1.0.132 633,256 12/23/2022
1.0.131 651,692 12/12/2022
1.0.130 654,319 12/4/2022
1.0.129 631,771 12/4/2022
1.0.128 632,516 11/30/2022
1.0.127 220,907 11/29/2022
1.0.126 221,082 11/28/2022
1.0.125 636,004 11/18/2022
1.0.124 659,264 11/11/2022
1.0.123 632,053 11/11/2022
1.0.122 221,147 11/10/2022
1.0.121 632,324 11/5/2022
1.0.120 633,673 11/4/2022
1.0.119 655,764 11/1/2022
1.0.118 656,047 10/16/2022
1.0.117 639,308 9/10/2022
1.0.116 682,875 9/8/2022
1.0.115 632,580 9/8/2022
1.0.114 221,752 9/8/2022
1.0.113 634,915 9/4/2022
1.0.112 311,348 8/24/2022
1.0.111 641,983 8/8/2022
1.0.110 635,651 7/26/2022
1.0.109 632,794 7/26/2022
1.0.108 685,270 7/19/2022
1.0.107 266,811 7/18/2022
1.0.106 226,871 7/8/2022
1.0.105 637,004 6/18/2022
1.0.104 632,819 6/6/2022
1.0.103 729,373 4/30/2022
1.0.102 633,084 4/20/2022
1.0.101 633,137 4/10/2022
1.0.100 633,110 4/7/2022
1.0.99 633,032 4/7/2022
1.0.98 633,225 4/2/2022
1.0.97 233,590 3/29/2022
1.0.96 225,166 3/27/2022
1.0.95 508,245 1/24/2022
1.0.94 792,060 12/29/2021
1.0.93 659,329 12/20/2021
1.0.92 632,744 12/13/2021
1.0.91 688,867 12/6/2021
1.0.90 223,391 12/2/2021
1.0.89 660,458 11/29/2021
1.0.88 659,053 11/22/2021
1.0.87 220,205 11/17/2021
1.0.86 660,883 11/13/2021
1.0.85 223,649 11/10/2021
1.0.84 631,211 11/9/2021
1.0.83 282,776 11/5/2021
1.0.82 632,946 11/4/2021
1.0.81 631,097 11/4/2021
1.0.80 631,009 11/3/2021
1.0.79 631,258 10/30/2021
1.0.78 662,504 10/21/2021
1.0.77 631,686 10/17/2021
1.0.76 692,431 10/14/2021
1.0.75 642,324 10/13/2021
1.0.74 631,282 10/12/2021
1.0.73 662,915 10/11/2021
1.0.72 631,112 10/9/2021
1.0.71 666,276 10/7/2021
1.0.70 668,347 10/7/2021
1.0.69 631,233 10/7/2021
1.0.68 220,378 10/6/2021
1.0.67 631,355 9/28/2021
1.0.66 665,085 9/23/2021
1.0.65 632,987 9/10/2021
1.0.64 631,095 9/9/2021
1.0.63 631,115 9/8/2021
1.0.62 631,228 9/8/2021
1.0.61 661,999 9/6/2021
1.0.60 220,579 8/31/2021
1.0.59 220,349 8/30/2021
1.0.58 664,281 7/31/2021
1.0.57 690,806 7/30/2021
1.0.56 631,560 7/26/2021
1.0.55 720,135 7/5/2021
1.0.54 220,586 7/1/2021
1.0.53 693,640 6/4/2021
1.0.52 721,361 4/26/2021
1.0.51 661,940 4/19/2021
1.0.50 779,942 4/7/2021
1.0.49 661,147 4/3/2021
1.0.48 809,136 3/22/2021
1.0.47 742,984 3/4/2021
1.0.46 664,304 2/26/2021
1.0.45 798,278 2/2/2021
1.0.44 334,748 1/24/2021
1.0.43 221,043 1/24/2021
1.0.42 220,682 1/23/2021
1.0.41 278,100 1/20/2021
1.0.40 631,463 1/20/2021
1.0.39 249,144 1/18/2021
1.0.38 220,632 1/18/2021
1.0.37 658,610 1/16/2021
1.0.36 748,412 12/16/2020
1.0.35 685,901 12/14/2020
1.0.34 663,677 12/9/2020
1.0.33 633,754 12/6/2020
1.0.32 221,071 12/2/2020
1.0.31 631,779 12/2/2020
1.0.30 660,044 12/1/2020
1.0.29 820,373 11/12/2020
1.0.29-atestpub 2,465 11/11/2020
1.0.28 661,067 10/11/2020
1.0.27 742,849 9/9/2020
1.0.26 659,622 9/3/2020
1.0.25 249,375 8/20/2020
1.0.24 715,328 8/9/2020
1.0.23 249,654 7/28/2020
1.0.22 248,612 7/19/2020
1.0.21 275,809 7/6/2020
1.0.20 715,757 6/6/2020
1.0.19 660,817 6/4/2020
1.0.18 277,164 5/29/2020
1.0.17 687,992 5/21/2020
1.0.16 632,610 5/17/2020
1.0.15 686,752 5/12/2020
1.0.14 741,164 5/4/2020
1.0.13 636,687 4/24/2020
1.0.12 639,404 4/22/2020
1.0.11 632,405 4/22/2020
1.0.10 632,441 4/21/2020
1.0.9 661,603 4/18/2020
1.0.8 248,639 4/16/2020
1.0.7 221,467 4/16/2020
1.0.6 654,590 4/15/2020
1.0.5 657,192 4/11/2020
1.0.4 656,088 4/3/2020
1.0.3 220,947 4/1/2020
1.0.2 643,016 3/27/2020
1.0.1 642,039 3/22/2020
1.0.0 224,311 3/22/2020

SynchronizedList. RemoveRange callbacks fix.
SynchronizedSet. Preserve comparer in set operations.
PairSet. Update key-value fix.
Added comprehensive README.md documentation for all projects