Ecng.Collections 1.0.285

dotnet add package Ecng.Collections --version 1.0.285
                    
NuGet\Install-Package Ecng.Collections -Version 1.0.285
                    
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.285" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Ecng.Collections" Version="1.0.285" />
                    
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.285
                    
#r "nuget: Ecng.Collections, 1.0.285"
                    
#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.285
                    
#: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.285
                    
Install as a Cake Addin
#tool nuget:?package=Ecng.Collections&version=1.0.285
                    
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>
{
    Lock 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.285 1,400 2/4/2026
1.0.284 1,968 2/1/2026
1.0.283 1,676 1/26/2026
1.0.282 867 1/22/2026
1.0.281 2,112 1/19/2026
1.0.280 838 1/19/2026
1.0.279 815 1/18/2026
1.0.278 807 1/18/2026
1.0.277 1,453 1/14/2026
1.0.276 870 1/13/2026
1.0.275 821 1/13/2026
1.0.274 5,495 1/9/2026
1.0.273 6,673 1/9/2026
1.0.272 32,754 1/4/2026
1.0.271 49,824 12/30/2025
1.0.270 52,381 12/29/2025
1.0.269 70,865 12/26/2025
1.0.268 70,881 12/26/2025
1.0.267 70,925 12/26/2025
1.0.266 70,935 12/26/2025
1.0.265 76,423 12/25/2025
1.0.264 77,692 12/25/2025
1.0.263 94,397 12/22/2025
1.0.262 101,409 12/21/2025
1.0.261 109,715 12/19/2025
1.0.260 110,385 12/19/2025
1.0.259 118,758 12/17/2025
1.0.258 133,350 12/15/2025
1.0.257 133,247 12/15/2025
1.0.256 139,512 12/14/2025
1.0.255 160,327 12/12/2025
1.0.254 159,638 12/12/2025
1.0.253 159,260 12/12/2025
1.0.252 159,255 12/12/2025
1.0.251 160,008 12/12/2025
1.0.250 223,150 12/2/2025
1.0.249 223,364 12/2/2025
1.0.248 224,147 12/2/2025
1.0.247 239,714 11/30/2025
1.0.246 242,712 11/29/2025
1.0.245 244,878 11/28/2025
1.0.244 245,589 11/28/2025
1.0.243 249,400 11/27/2025
1.0.242 269,146 11/24/2025
1.0.241 270,895 11/24/2025
1.0.240 275,677 11/23/2025
1.0.239 281,087 11/22/2025
1.0.238 299,205 11/20/2025
1.0.237 322,176 11/18/2025
1.0.236 322,851 11/18/2025
1.0.235 365,607 11/13/2025
1.0.234 398,257 11/10/2025
1.0.233 438,907 11/1/2025
1.0.232 438,163 10/28/2025
1.0.231 438,125 10/27/2025
1.0.230 437,990 10/27/2025
1.0.229 437,923 10/25/2025
1.0.228 488,386 10/3/2025
1.0.227 488,447 9/28/2025
1.0.226 488,193 9/25/2025
1.0.225 512,611 8/30/2025
1.0.224 486,788 7/13/2025
1.0.223 478,187 7/13/2025
1.0.222 478,208 7/12/2025
1.0.221 479,548 7/8/2025
1.0.220 478,998 7/4/2025
1.0.219 478,282 7/2/2025
1.0.218 483,168 6/16/2025
1.0.217 478,437 6/9/2025
1.0.216 478,298 6/8/2025
1.0.215 479,944 5/21/2025
1.0.214 478,424 5/17/2025
1.0.213 480,011 5/12/2025
1.0.212 478,340 5/12/2025
1.0.211 480,855 4/17/2025
1.0.210 483,436 3/22/2025
1.0.209 478,313 3/20/2025
1.0.208 478,245 3/20/2025
1.0.207 478,285 3/19/2025
1.0.206 483,478 2/26/2025
1.0.205 478,376 2/26/2025
1.0.204 486,798 2/5/2025
1.0.203 482,298 1/21/2025
1.0.202 481,657 1/14/2025
1.0.201 480,479 1/12/2025
1.0.200 478,937 1/10/2025
1.0.199 482,621 12/27/2024
1.0.198 479,388 11/20/2024
1.0.197 481,894 11/18/2024
1.0.196 480,205 11/7/2024
1.0.195 479,602 10/19/2024
1.0.194 481,447 10/12/2024
1.0.193 482,016 10/5/2024
1.0.192 483,105 9/18/2024
1.0.191 478,392 9/17/2024
1.0.190 482,800 9/3/2024
1.0.189 478,456 9/1/2024
1.0.188 492,552 6/12/2024
1.0.187 481,311 5/28/2024
1.0.186 482,056 5/4/2024
1.0.185 480,728 4/23/2024
1.0.184 479,814 4/21/2024
1.0.183 478,639 4/14/2024
1.0.182 484,004 3/28/2024
1.0.181 478,587 3/17/2024
1.0.180 482,015 2/23/2024
1.0.179 478,609 2/23/2024
1.0.178 481,984 2/18/2024
1.0.177 478,602 2/18/2024
1.0.176 478,661 2/16/2024
1.0.175 480,740 2/13/2024
1.0.174 480,466 2/8/2024
1.0.173 480,918 2/5/2024
1.0.172 478,629 2/4/2024
1.0.171 481,179 1/23/2024
1.0.170 478,756 1/23/2024
1.0.169 480,448 1/12/2024
1.0.168 483,891 1/2/2024
1.0.167 478,980 12/29/2023
1.0.166 497,161 11/12/2023
1.0.165 890,272 11/10/2023
1.0.164 478,935 11/10/2023
1.0.163 889,963 11/9/2023
1.0.162 890,874 11/3/2023
1.0.161 889,795 11/1/2023
1.0.160 889,842 11/1/2023
1.0.159 915,215 9/8/2023
1.0.158 890,260 9/8/2023
1.0.157 890,525 9/3/2023
1.0.156 890,775 8/21/2023
1.0.155 480,184 8/14/2023
1.0.154 891,300 8/10/2023
1.0.153 930,958 6/29/2023
1.0.152 905,370 5/27/2023
1.0.151 479,869 5/21/2023
1.0.150 479,980 5/19/2023
1.0.149 916,365 5/8/2023
1.0.148 896,271 4/21/2023
1.0.147 941,994 4/3/2023
1.0.146 898,450 3/13/2023
1.0.145 910,299 3/6/2023
1.0.144 892,434 2/26/2023
1.0.143 496,362 2/21/2023
1.0.142 480,775 2/20/2023
1.0.141 482,033 2/15/2023
1.0.140 480,793 2/14/2023
1.0.139 924,250 2/9/2023
1.0.138 497,209 2/7/2023
1.0.137 892,300 2/4/2023
1.0.136 912,368 2/2/2023
1.0.135 908,655 1/30/2023
1.0.134 486,813 1/18/2023
1.0.133 936,043 12/30/2022
1.0.132 894,358 12/23/2022
1.0.131 912,770 12/12/2022
1.0.130 915,405 12/4/2022
1.0.129 892,860 12/4/2022
1.0.128 893,589 11/30/2022
1.0.127 481,985 11/29/2022
1.0.126 482,151 11/28/2022
1.0.125 897,083 11/18/2022
1.0.124 920,348 11/11/2022
1.0.123 893,135 11/11/2022
1.0.122 482,227 11/10/2022
1.0.121 893,414 11/5/2022
1.0.120 894,755 11/4/2022
1.0.119 916,861 11/1/2022
1.0.118 917,149 10/16/2022
1.0.117 900,393 9/10/2022
1.0.116 943,969 9/8/2022
1.0.115 893,666 9/8/2022
1.0.114 482,847 9/8/2022
1.0.113 895,994 9/4/2022
1.0.112 572,440 8/24/2022
1.0.111 903,066 8/8/2022
1.0.110 896,739 7/26/2022
1.0.109 893,889 7/26/2022
1.0.108 946,352 7/19/2022
1.0.107 527,910 7/18/2022
1.0.106 487,967 7/8/2022
1.0.105 898,090 6/18/2022
1.0.104 893,907 6/6/2022
1.0.103 990,471 4/30/2022
1.0.102 894,164 4/20/2022
1.0.101 894,216 4/10/2022
1.0.100 894,204 4/7/2022
1.0.99 894,119 4/7/2022
1.0.98 894,301 4/2/2022
1.0.97 494,692 3/29/2022
1.0.96 486,253 3/27/2022
1.0.95 769,509 1/24/2022
1.0.94 1,053,154 12/29/2021
1.0.93 920,419 12/20/2021
1.0.92 893,832 12/13/2021
1.0.91 949,950 12/6/2021
1.0.90 484,470 12/2/2021
1.0.89 921,541 11/29/2021
1.0.88 920,130 11/22/2021
1.0.87 481,280 11/17/2021
1.0.86 921,985 11/13/2021
1.0.85 484,728 11/10/2021
1.0.84 892,303 11/9/2021
1.0.83 543,852 11/5/2021
1.0.82 894,042 11/4/2021
1.0.81 892,175 11/4/2021
1.0.80 892,112 11/3/2021
1.0.79 892,341 10/30/2021
1.0.78 923,607 10/21/2021
1.0.77 892,774 10/17/2021
1.0.76 953,536 10/14/2021
1.0.75 903,414 10/13/2021
1.0.74 892,370 10/12/2021
1.0.73 924,015 10/11/2021
1.0.72 892,200 10/9/2021
1.0.71 927,398 10/7/2021
1.0.70 929,453 10/7/2021
1.0.69 892,317 10/7/2021
1.0.68 481,463 10/6/2021
1.0.67 892,443 9/28/2021
1.0.66 926,183 9/23/2021
1.0.65 894,073 9/10/2021
1.0.64 892,190 9/9/2021
1.0.63 892,207 9/8/2021
1.0.62 892,325 9/8/2021
1.0.61 923,086 9/6/2021
1.0.60 481,674 8/31/2021
1.0.59 481,435 8/30/2021
1.0.58 925,384 7/31/2021
1.0.57 951,889 7/30/2021
1.0.56 892,652 7/26/2021
1.0.55 981,230 7/5/2021
1.0.54 481,668 7/1/2021
1.0.53 954,760 6/4/2021
1.0.52 982,449 4/26/2021
1.0.51 923,039 4/19/2021
1.0.50 1,041,044 4/7/2021
1.0.49 922,250 4/3/2021
1.0.48 1,070,273 3/22/2021
1.0.47 1,004,101 3/4/2021
1.0.46 925,424 2/26/2021
1.0.45 1,059,384 2/2/2021
1.0.44 595,886 1/24/2021
1.0.43 482,151 1/24/2021
1.0.42 481,764 1/23/2021
1.0.41 539,203 1/20/2021
1.0.40 892,560 1/20/2021
1.0.39 510,241 1/18/2021
1.0.38 481,731 1/18/2021
1.0.37 919,698 1/16/2021
1.0.36 1,009,520 12/16/2020
1.0.35 946,969 12/14/2020
1.0.34 924,749 12/9/2020
1.0.33 894,836 12/6/2020
1.0.32 482,143 12/2/2020
1.0.31 892,843 12/2/2020
1.0.30 921,137 12/1/2020
1.0.29 1,081,478 11/12/2020
1.0.29-atestpub 2,484 11/11/2020
1.0.28 922,177 10/11/2020
1.0.27 1,003,970 9/9/2020
1.0.26 920,734 9/3/2020
1.0.25 510,462 8/20/2020
1.0.24 976,426 8/9/2020
1.0.23 510,737 7/28/2020
1.0.22 509,702 7/19/2020
1.0.21 536,895 7/6/2020
1.0.20 976,873 6/6/2020
1.0.19 921,900 6/4/2020
1.0.18 538,286 5/29/2020
1.0.17 949,078 5/21/2020
1.0.16 893,706 5/17/2020
1.0.15 947,834 5/12/2020
1.0.14 1,002,278 5/4/2020
1.0.13 897,777 4/24/2020
1.0.12 900,501 4/22/2020
1.0.11 893,496 4/22/2020
1.0.10 893,524 4/21/2020
1.0.9 922,681 4/18/2020
1.0.8 509,744 4/16/2020
1.0.7 482,552 4/16/2020
1.0.6 915,697 4/15/2020
1.0.5 918,291 4/11/2020
1.0.4 917,190 4/3/2020
1.0.3 482,046 4/1/2020
1.0.2 904,127 3/27/2020
1.0.1 903,134 3/22/2020
1.0.0 485,416 3/22/2020