Ecng.Collections 1.0.281

dotnet add package Ecng.Collections --version 1.0.281
                    
NuGet\Install-Package Ecng.Collections -Version 1.0.281
                    
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.281" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Ecng.Collections" Version="1.0.281" />
                    
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.281
                    
#r "nuget: Ecng.Collections, 1.0.281"
                    
#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.281
                    
#: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.281
                    
Install as a Cake Addin
#tool nuget:?package=Ecng.Collections&version=1.0.281
                    
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.281 143 1/19/2026
1.0.280 135 1/19/2026
1.0.279 148 1/18/2026
1.0.278 141 1/18/2026
1.0.277 628 1/14/2026
1.0.276 543 1/13/2026
1.0.275 574 1/13/2026
1.0.274 1,211 1/9/2026
1.0.273 878 1/9/2026
1.0.272 3,377 1/4/2026
1.0.271 2,261 12/30/2025
1.0.270 795 12/29/2025
1.0.269 1,218 12/26/2025
1.0.268 804 12/26/2025
1.0.267 785 12/26/2025
1.0.266 802 12/26/2025
1.0.265 859 12/25/2025
1.0.264 876 12/25/2025
1.0.263 1,373 12/22/2025
1.0.262 877 12/21/2025
1.0.261 5,803 12/19/2025
1.0.260 6,452 12/19/2025
1.0.259 14,830 12/17/2025
1.0.258 29,411 12/15/2025
1.0.257 29,321 12/15/2025
1.0.256 35,574 12/14/2025
1.0.255 56,396 12/12/2025
1.0.254 55,710 12/12/2025
1.0.253 55,320 12/12/2025
1.0.252 55,322 12/12/2025
1.0.251 56,062 12/12/2025
1.0.250 119,212 12/2/2025
1.0.249 119,441 12/2/2025
1.0.248 120,214 12/2/2025
1.0.247 135,793 11/30/2025
1.0.246 138,778 11/29/2025
1.0.245 140,958 11/28/2025
1.0.244 141,658 11/28/2025
1.0.243 145,477 11/27/2025
1.0.242 165,212 11/24/2025
1.0.241 166,963 11/24/2025
1.0.240 171,729 11/23/2025
1.0.239 177,147 11/22/2025
1.0.238 195,234 11/20/2025
1.0.237 218,231 11/18/2025
1.0.236 218,909 11/18/2025
1.0.235 261,661 11/13/2025
1.0.234 294,325 11/10/2025
1.0.233 334,983 11/1/2025
1.0.232 334,230 10/28/2025
1.0.231 334,195 10/27/2025
1.0.230 334,060 10/27/2025
1.0.229 333,996 10/25/2025
1.0.228 384,456 10/3/2025
1.0.227 384,533 9/28/2025
1.0.226 384,267 9/25/2025
1.0.225 408,230 8/30/2025
1.0.224 382,760 7/13/2025
1.0.223 374,264 7/13/2025
1.0.222 374,285 7/12/2025
1.0.221 375,549 7/8/2025
1.0.220 375,077 7/4/2025
1.0.219 374,355 7/2/2025
1.0.218 379,237 6/16/2025
1.0.217 374,509 6/9/2025
1.0.216 374,372 6/8/2025
1.0.215 376,014 5/21/2025
1.0.214 374,482 5/17/2025
1.0.213 376,086 5/12/2025
1.0.212 374,402 5/12/2025
1.0.211 376,857 4/17/2025
1.0.210 379,499 3/22/2025
1.0.209 374,370 3/20/2025
1.0.208 374,309 3/20/2025
1.0.207 374,354 3/19/2025
1.0.206 379,537 2/26/2025
1.0.205 374,436 2/26/2025
1.0.204 382,864 2/5/2025
1.0.203 378,360 1/21/2025
1.0.202 377,712 1/14/2025
1.0.201 376,550 1/12/2025
1.0.200 374,997 1/10/2025
1.0.199 378,658 12/27/2024
1.0.198 375,461 11/20/2024
1.0.197 377,943 11/18/2024
1.0.196 376,271 11/7/2024
1.0.195 375,661 10/19/2024
1.0.194 377,518 10/12/2024
1.0.193 378,064 10/5/2024
1.0.192 379,169 9/18/2024
1.0.191 374,455 9/17/2024
1.0.190 378,867 9/3/2024
1.0.189 374,518 9/1/2024
1.0.188 388,626 6/12/2024
1.0.187 377,368 5/28/2024
1.0.186 378,120 5/4/2024
1.0.185 376,801 4/23/2024
1.0.184 375,884 4/21/2024
1.0.183 374,707 4/14/2024
1.0.182 380,073 3/28/2024
1.0.181 374,653 3/17/2024
1.0.180 378,074 2/23/2024
1.0.179 374,675 2/23/2024
1.0.178 378,058 2/18/2024
1.0.177 374,646 2/18/2024
1.0.176 374,721 2/16/2024
1.0.175 376,816 2/13/2024
1.0.174 376,538 2/8/2024
1.0.173 377,000 2/5/2024
1.0.172 374,695 2/4/2024
1.0.171 377,241 1/23/2024
1.0.170 374,809 1/23/2024
1.0.169 376,514 1/12/2024
1.0.168 379,934 1/2/2024
1.0.167 375,027 12/29/2023
1.0.166 393,215 11/12/2023
1.0.165 786,330 11/10/2023
1.0.164 374,991 11/10/2023
1.0.163 786,026 11/9/2023
1.0.162 786,921 11/3/2023
1.0.161 785,857 11/1/2023
1.0.160 785,912 11/1/2023
1.0.159 811,264 9/8/2023
1.0.158 786,334 9/8/2023
1.0.157 786,581 9/3/2023
1.0.156 786,842 8/21/2023
1.0.155 376,250 8/14/2023
1.0.154 787,366 8/10/2023
1.0.153 827,020 6/29/2023
1.0.152 801,436 5/27/2023
1.0.151 375,937 5/21/2023
1.0.150 376,049 5/19/2023
1.0.149 812,425 5/8/2023
1.0.148 792,351 4/21/2023
1.0.147 838,056 4/3/2023
1.0.146 794,519 3/13/2023
1.0.145 806,360 3/6/2023
1.0.144 788,499 2/26/2023
1.0.143 392,434 2/21/2023
1.0.142 376,838 2/20/2023
1.0.141 378,098 2/15/2023
1.0.140 376,852 2/14/2023
1.0.139 820,329 2/9/2023
1.0.138 393,272 2/7/2023
1.0.137 788,379 2/4/2023
1.0.136 808,441 2/2/2023
1.0.135 804,729 1/30/2023
1.0.134 382,877 1/18/2023
1.0.133 832,085 12/30/2022
1.0.132 790,415 12/23/2022
1.0.131 808,845 12/12/2022
1.0.130 811,467 12/4/2022
1.0.129 788,925 12/4/2022
1.0.128 789,673 11/30/2022
1.0.127 378,057 11/29/2022
1.0.126 378,228 11/28/2022
1.0.125 793,149 11/18/2022
1.0.124 816,414 11/11/2022
1.0.123 789,204 11/11/2022
1.0.122 378,296 11/10/2022
1.0.121 789,480 11/5/2022
1.0.120 790,820 11/4/2022
1.0.119 812,925 11/1/2022
1.0.118 813,219 10/16/2022
1.0.117 796,464 9/10/2022
1.0.116 840,037 9/8/2022
1.0.115 789,725 9/8/2022
1.0.114 378,908 9/8/2022
1.0.113 792,067 9/4/2022
1.0.112 468,503 8/24/2022
1.0.111 799,138 8/8/2022
1.0.110 792,801 7/26/2022
1.0.109 789,955 7/26/2022
1.0.108 842,420 7/19/2022
1.0.107 423,956 7/18/2022
1.0.106 384,035 7/8/2022
1.0.105 794,156 6/18/2022
1.0.104 789,975 6/6/2022
1.0.103 886,527 4/30/2022
1.0.102 790,234 4/20/2022
1.0.101 790,283 4/10/2022
1.0.100 790,259 4/7/2022
1.0.99 790,180 4/7/2022
1.0.98 790,367 4/2/2022
1.0.97 390,746 3/29/2022
1.0.96 382,325 3/27/2022
1.0.95 665,450 1/24/2022
1.0.94 949,206 12/29/2021
1.0.93 816,483 12/20/2021
1.0.92 789,902 12/13/2021
1.0.91 846,016 12/6/2021
1.0.90 380,547 12/2/2021
1.0.89 817,605 11/29/2021
1.0.88 816,205 11/22/2021
1.0.87 377,354 11/17/2021
1.0.86 818,034 11/13/2021
1.0.85 380,795 11/10/2021
1.0.84 788,363 11/9/2021
1.0.83 439,927 11/5/2021
1.0.82 790,100 11/4/2021
1.0.81 788,257 11/4/2021
1.0.80 788,171 11/3/2021
1.0.79 788,414 10/30/2021
1.0.78 819,659 10/21/2021
1.0.77 788,841 10/17/2021
1.0.76 849,595 10/14/2021
1.0.75 799,479 10/13/2021
1.0.74 788,430 10/12/2021
1.0.73 820,082 10/11/2021
1.0.72 788,260 10/9/2021
1.0.71 823,437 10/7/2021
1.0.70 825,500 10/7/2021
1.0.69 788,387 10/7/2021
1.0.68 377,519 10/6/2021
1.0.67 788,515 9/28/2021
1.0.66 822,241 9/23/2021
1.0.65 790,134 9/10/2021
1.0.64 788,247 9/9/2021
1.0.63 788,257 9/8/2021
1.0.62 788,381 9/8/2021
1.0.61 819,141 9/6/2021
1.0.60 377,728 8/31/2021
1.0.59 377,503 8/30/2021
1.0.58 821,438 7/31/2021
1.0.57 847,954 7/30/2021
1.0.56 788,718 7/26/2021
1.0.55 877,297 7/5/2021
1.0.54 377,741 7/1/2021
1.0.53 850,824 6/4/2021
1.0.52 878,520 4/26/2021
1.0.51 819,086 4/19/2021
1.0.50 937,099 4/7/2021
1.0.49 818,298 4/3/2021
1.0.48 966,304 3/22/2021
1.0.47 900,163 3/4/2021
1.0.46 821,469 2/26/2021
1.0.45 955,453 2/2/2021
1.0.44 491,922 1/24/2021
1.0.43 378,202 1/24/2021
1.0.42 377,816 1/23/2021
1.0.41 435,240 1/20/2021
1.0.40 788,611 1/20/2021
1.0.39 406,299 1/18/2021
1.0.38 377,780 1/18/2021
1.0.37 815,767 1/16/2021
1.0.36 905,575 12/16/2020
1.0.35 843,044 12/14/2020
1.0.34 820,819 12/9/2020
1.0.33 790,895 12/6/2020
1.0.32 378,206 12/2/2020
1.0.31 788,927 12/2/2020
1.0.30 817,200 12/1/2020
1.0.29 977,522 11/12/2020
1.0.29-atestpub 2,475 11/11/2020
1.0.28 818,217 10/11/2020
1.0.27 899,996 9/9/2020
1.0.26 816,785 9/3/2020
1.0.25 406,517 8/20/2020
1.0.24 872,479 8/9/2020
1.0.23 406,798 7/28/2020
1.0.22 405,749 7/19/2020
1.0.21 432,956 7/6/2020
1.0.20 872,924 6/6/2020
1.0.19 817,957 6/4/2020
1.0.18 434,336 5/29/2020
1.0.17 845,138 5/21/2020
1.0.16 789,749 5/17/2020
1.0.15 843,903 5/12/2020
1.0.14 898,331 5/4/2020
1.0.13 793,832 4/24/2020
1.0.12 796,550 4/22/2020
1.0.11 789,561 4/22/2020
1.0.10 789,581 4/21/2020
1.0.9 818,743 4/18/2020
1.0.8 405,797 4/16/2020
1.0.7 378,609 4/16/2020
1.0.6 811,754 4/15/2020
1.0.5 814,352 4/11/2020
1.0.4 813,241 4/3/2020
1.0.3 378,096 4/1/2020
1.0.2 800,168 3/27/2020
1.0.1 799,206 3/22/2020
1.0.0 381,488 3/22/2020

Add polyfills for netstandard2.0 compatibility