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 702 1/19/2026
1.0.280 614 1/19/2026
1.0.279 595 1/18/2026
1.0.278 577 1/18/2026
1.0.277 1,272 1/14/2026
1.0.276 853 1/13/2026
1.0.275 804 1/13/2026
1.0.274 1,242 1/9/2026
1.0.273 884 1/9/2026
1.0.272 3,378 1/4/2026
1.0.271 2,262 12/30/2025
1.0.270 796 12/29/2025
1.0.269 1,219 12/26/2025
1.0.268 815 12/26/2025
1.0.267 786 12/26/2025
1.0.266 803 12/26/2025
1.0.265 860 12/25/2025
1.0.264 877 12/25/2025
1.0.263 1,384 12/22/2025
1.0.262 5,247 12/21/2025
1.0.261 13,552 12/19/2025
1.0.260 14,225 12/19/2025
1.0.259 22,601 12/17/2025
1.0.258 37,183 12/15/2025
1.0.257 37,093 12/15/2025
1.0.256 43,347 12/14/2025
1.0.255 64,167 12/12/2025
1.0.254 63,482 12/12/2025
1.0.253 63,092 12/12/2025
1.0.252 63,093 12/12/2025
1.0.251 63,834 12/12/2025
1.0.250 126,981 12/2/2025
1.0.249 127,213 12/2/2025
1.0.248 127,987 12/2/2025
1.0.247 143,563 11/30/2025
1.0.246 146,550 11/29/2025
1.0.245 148,727 11/28/2025
1.0.244 149,429 11/28/2025
1.0.243 153,248 11/27/2025
1.0.242 172,984 11/24/2025
1.0.241 174,735 11/24/2025
1.0.240 179,500 11/23/2025
1.0.239 184,920 11/22/2025
1.0.238 203,009 11/20/2025
1.0.237 226,005 11/18/2025
1.0.236 226,683 11/18/2025
1.0.235 269,434 11/13/2025
1.0.234 302,099 11/10/2025
1.0.233 342,754 11/1/2025
1.0.232 342,004 10/28/2025
1.0.231 341,966 10/27/2025
1.0.230 341,833 10/27/2025
1.0.229 341,770 10/25/2025
1.0.228 392,227 10/3/2025
1.0.227 392,304 9/28/2025
1.0.226 392,041 9/25/2025
1.0.225 416,030 8/30/2025
1.0.224 390,533 7/13/2025
1.0.223 382,035 7/13/2025
1.0.222 382,055 7/12/2025
1.0.221 383,323 7/8/2025
1.0.220 382,849 7/4/2025
1.0.219 382,125 7/2/2025
1.0.218 387,009 6/16/2025
1.0.217 382,279 6/9/2025
1.0.216 382,145 6/8/2025
1.0.215 383,784 5/21/2025
1.0.214 382,255 5/17/2025
1.0.213 383,858 5/12/2025
1.0.212 382,175 5/12/2025
1.0.211 384,629 4/17/2025
1.0.210 387,270 3/22/2025
1.0.209 382,144 3/20/2025
1.0.208 382,079 3/20/2025
1.0.207 382,124 3/19/2025
1.0.206 387,313 2/26/2025
1.0.205 382,208 2/26/2025
1.0.204 390,635 2/5/2025
1.0.203 386,130 1/21/2025
1.0.202 385,484 1/14/2025
1.0.201 384,323 1/12/2025
1.0.200 382,770 1/10/2025
1.0.199 386,433 12/27/2024
1.0.198 383,236 11/20/2024
1.0.197 385,717 11/18/2024
1.0.196 384,044 11/7/2024
1.0.195 383,435 10/19/2024
1.0.194 385,291 10/12/2024
1.0.193 385,838 10/5/2024
1.0.192 386,942 9/18/2024
1.0.191 382,226 9/17/2024
1.0.190 386,639 9/3/2024
1.0.189 382,289 9/1/2024
1.0.188 396,397 6/12/2024
1.0.187 385,139 5/28/2024
1.0.186 385,893 5/4/2024
1.0.185 384,573 4/23/2024
1.0.184 383,656 4/21/2024
1.0.183 382,480 4/14/2024
1.0.182 387,846 3/28/2024
1.0.181 382,428 3/17/2024
1.0.180 385,847 2/23/2024
1.0.179 382,448 2/23/2024
1.0.178 385,831 2/18/2024
1.0.177 382,420 2/18/2024
1.0.176 382,496 2/16/2024
1.0.175 384,590 2/13/2024
1.0.174 384,308 2/8/2024
1.0.173 384,772 2/5/2024
1.0.172 382,468 2/4/2024
1.0.171 385,015 1/23/2024
1.0.170 382,581 1/23/2024
1.0.169 384,287 1/12/2024
1.0.168 387,707 1/2/2024
1.0.167 382,801 12/29/2023
1.0.166 400,990 11/12/2023
1.0.165 794,104 11/10/2023
1.0.164 382,765 11/10/2023
1.0.163 793,799 11/9/2023
1.0.162 794,705 11/3/2023
1.0.161 793,630 11/1/2023
1.0.160 793,682 11/1/2023
1.0.159 819,036 9/8/2023
1.0.158 794,106 9/8/2023
1.0.157 794,353 9/3/2023
1.0.156 794,613 8/21/2023
1.0.155 384,020 8/14/2023
1.0.154 795,138 8/10/2023
1.0.153 834,793 6/29/2023
1.0.152 809,207 5/27/2023
1.0.151 383,711 5/21/2023
1.0.150 383,819 5/19/2023
1.0.149 820,198 5/8/2023
1.0.148 800,122 4/21/2023
1.0.147 845,829 4/3/2023
1.0.146 802,289 3/13/2023
1.0.145 814,133 3/6/2023
1.0.144 796,269 2/26/2023
1.0.143 400,207 2/21/2023
1.0.142 384,613 2/20/2023
1.0.141 385,871 2/15/2023
1.0.140 384,627 2/14/2023
1.0.139 828,101 2/9/2023
1.0.138 401,046 2/7/2023
1.0.137 796,152 2/4/2023
1.0.136 816,215 2/2/2023
1.0.135 812,501 1/30/2023
1.0.134 390,651 1/18/2023
1.0.133 839,858 12/30/2022
1.0.132 798,188 12/23/2022
1.0.131 816,618 12/12/2022
1.0.130 819,239 12/4/2022
1.0.129 796,698 12/4/2022
1.0.128 797,447 11/30/2022
1.0.127 385,830 11/29/2022
1.0.126 386,000 11/28/2022
1.0.125 800,922 11/18/2022
1.0.124 824,189 11/11/2022
1.0.123 796,977 11/11/2022
1.0.122 386,070 11/10/2022
1.0.121 797,253 11/5/2022
1.0.120 798,595 11/4/2022
1.0.119 820,698 11/1/2022
1.0.118 820,989 10/16/2022
1.0.117 804,236 9/10/2022
1.0.116 847,807 9/8/2022
1.0.115 797,496 9/8/2022
1.0.114 386,678 9/8/2022
1.0.113 799,836 9/4/2022
1.0.112 476,275 8/24/2022
1.0.111 806,907 8/8/2022
1.0.110 800,574 7/26/2022
1.0.109 797,725 7/26/2022
1.0.108 850,193 7/19/2022
1.0.107 431,726 7/18/2022
1.0.106 391,806 7/8/2022
1.0.105 801,929 6/18/2022
1.0.104 797,749 6/6/2022
1.0.103 894,302 4/30/2022
1.0.102 798,008 4/20/2022
1.0.101 798,058 4/10/2022
1.0.100 798,032 4/7/2022
1.0.99 797,956 4/7/2022
1.0.98 798,142 4/2/2022
1.0.97 398,521 3/29/2022
1.0.96 390,098 3/27/2022
1.0.95 673,228 1/24/2022
1.0.94 956,978 12/29/2021
1.0.93 824,259 12/20/2021
1.0.92 797,675 12/13/2021
1.0.91 853,792 12/6/2021
1.0.90 388,321 12/2/2021
1.0.89 825,381 11/29/2021
1.0.88 823,980 11/22/2021
1.0.87 385,130 11/17/2021
1.0.86 825,805 11/13/2021
1.0.85 388,569 11/10/2021
1.0.84 796,139 11/9/2021
1.0.83 447,700 11/5/2021
1.0.82 797,875 11/4/2021
1.0.81 796,030 11/4/2021
1.0.80 795,945 11/3/2021
1.0.79 796,188 10/30/2021
1.0.78 827,433 10/21/2021
1.0.77 796,615 10/17/2021
1.0.76 857,367 10/14/2021
1.0.75 807,253 10/13/2021
1.0.74 796,203 10/12/2021
1.0.73 827,858 10/11/2021
1.0.72 796,032 10/9/2021
1.0.71 831,212 10/7/2021
1.0.70 833,274 10/7/2021
1.0.69 796,158 10/7/2021
1.0.68 385,290 10/6/2021
1.0.67 796,286 9/28/2021
1.0.66 830,013 9/23/2021
1.0.65 797,906 9/10/2021
1.0.64 796,020 9/9/2021
1.0.63 796,031 9/8/2021
1.0.62 796,156 9/8/2021
1.0.61 826,916 9/6/2021
1.0.60 385,502 8/31/2021
1.0.59 385,277 8/30/2021
1.0.58 829,213 7/31/2021
1.0.57 855,729 7/30/2021
1.0.56 796,492 7/26/2021
1.0.55 885,073 7/5/2021
1.0.54 385,516 7/1/2021
1.0.53 858,600 6/4/2021
1.0.52 886,292 4/26/2021
1.0.51 826,859 4/19/2021
1.0.50 944,872 4/7/2021
1.0.49 826,071 4/3/2021
1.0.48 974,095 3/22/2021
1.0.47 907,935 3/4/2021
1.0.46 829,243 2/26/2021
1.0.45 963,237 2/2/2021
1.0.44 499,696 1/24/2021
1.0.43 385,976 1/24/2021
1.0.42 385,591 1/23/2021
1.0.41 443,022 1/20/2021
1.0.40 796,386 1/20/2021
1.0.39 414,073 1/18/2021
1.0.38 385,554 1/18/2021
1.0.37 823,541 1/16/2021
1.0.36 913,347 12/16/2020
1.0.35 850,816 12/14/2020
1.0.34 828,593 12/9/2020
1.0.33 798,668 12/6/2020
1.0.32 385,988 12/2/2020
1.0.31 796,697 12/2/2020
1.0.30 824,972 12/1/2020
1.0.29 985,295 11/12/2020
1.0.29-atestpub 2,475 11/11/2020
1.0.28 825,993 10/11/2020
1.0.27 907,769 9/9/2020
1.0.26 824,558 9/3/2020
1.0.25 414,290 8/20/2020
1.0.24 880,251 8/9/2020
1.0.23 414,571 7/28/2020
1.0.22 413,523 7/19/2020
1.0.21 440,729 7/6/2020
1.0.20 880,698 6/6/2020
1.0.19 825,730 6/4/2020
1.0.18 442,109 5/29/2020
1.0.17 852,911 5/21/2020
1.0.16 797,523 5/17/2020
1.0.15 851,676 5/12/2020
1.0.14 906,113 5/4/2020
1.0.13 801,608 4/24/2020
1.0.12 804,325 4/22/2020
1.0.11 797,336 4/22/2020
1.0.10 797,356 4/21/2020
1.0.9 826,517 4/18/2020
1.0.8 413,571 4/16/2020
1.0.7 386,384 4/16/2020
1.0.6 819,528 4/15/2020
1.0.5 822,126 4/11/2020
1.0.4 821,014 4/3/2020
1.0.3 385,870 4/1/2020
1.0.2 807,941 3/27/2020
1.0.1 806,977 3/22/2020
1.0.0 389,262 3/22/2020

Add polyfills for netstandard2.0 compatibility