Ecng.Collections 1.0.283

dotnet add package Ecng.Collections --version 1.0.283
                    
NuGet\Install-Package Ecng.Collections -Version 1.0.283
                    
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.283" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Ecng.Collections" Version="1.0.283" />
                    
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.283
                    
#r "nuget: Ecng.Collections, 1.0.283"
                    
#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.283
                    
#: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.283
                    
Install as a Cake Addin
#tool nuget:?package=Ecng.Collections&version=1.0.283
                    
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.283 1,023 1/26/2026
1.0.282 697 1/22/2026
1.0.281 2,029 1/19/2026
1.0.280 833 1/19/2026
1.0.279 810 1/18/2026
1.0.278 802 1/18/2026
1.0.277 1,434 1/14/2026
1.0.276 865 1/13/2026
1.0.275 817 1/13/2026
1.0.274 1,247 1/9/2026
1.0.273 891 1/9/2026
1.0.272 3,383 1/4/2026
1.0.271 2,265 12/30/2025
1.0.270 801 12/29/2025
1.0.269 19,199 12/26/2025
1.0.268 19,208 12/26/2025
1.0.267 19,244 12/26/2025
1.0.266 19,263 12/26/2025
1.0.265 24,749 12/25/2025
1.0.264 26,012 12/25/2025
1.0.263 42,715 12/22/2025
1.0.262 49,724 12/21/2025
1.0.261 58,029 12/19/2025
1.0.260 58,703 12/19/2025
1.0.259 67,084 12/17/2025
1.0.258 81,664 12/15/2025
1.0.257 81,569 12/15/2025
1.0.256 87,826 12/14/2025
1.0.255 108,648 12/12/2025
1.0.254 107,956 12/12/2025
1.0.253 107,573 12/12/2025
1.0.252 107,576 12/12/2025
1.0.251 108,321 12/12/2025
1.0.250 171,456 12/2/2025
1.0.249 171,685 12/2/2025
1.0.248 172,468 12/2/2025
1.0.247 188,038 11/30/2025
1.0.246 191,027 11/29/2025
1.0.245 193,210 11/28/2025
1.0.244 193,911 11/28/2025
1.0.243 197,730 11/27/2025
1.0.242 217,464 11/24/2025
1.0.241 219,215 11/24/2025
1.0.240 223,987 11/23/2025
1.0.239 229,397 11/22/2025
1.0.238 247,499 11/20/2025
1.0.237 270,482 11/18/2025
1.0.236 271,165 11/18/2025
1.0.235 313,918 11/13/2025
1.0.234 346,575 11/10/2025
1.0.233 387,237 11/1/2025
1.0.232 386,482 10/28/2025
1.0.231 386,446 10/27/2025
1.0.230 386,315 10/27/2025
1.0.229 386,246 10/25/2025
1.0.228 436,707 10/3/2025
1.0.227 436,781 9/28/2025
1.0.226 436,524 9/25/2025
1.0.225 460,566 8/30/2025
1.0.224 435,022 7/13/2025
1.0.223 426,510 7/13/2025
1.0.222 426,535 7/12/2025
1.0.221 427,863 7/8/2025
1.0.220 427,332 7/4/2025
1.0.219 426,616 7/2/2025
1.0.218 431,493 6/16/2025
1.0.217 426,764 6/9/2025
1.0.216 426,632 6/8/2025
1.0.215 428,276 5/21/2025
1.0.214 426,746 5/17/2025
1.0.213 428,340 5/12/2025
1.0.212 426,660 5/12/2025
1.0.211 429,120 4/17/2025
1.0.210 431,752 3/22/2025
1.0.209 426,627 3/20/2025
1.0.208 426,565 3/20/2025
1.0.207 426,606 3/19/2025
1.0.206 431,799 2/26/2025
1.0.205 426,688 2/26/2025
1.0.204 435,116 2/5/2025
1.0.203 430,608 1/21/2025
1.0.202 429,966 1/14/2025
1.0.201 428,799 1/12/2025
1.0.200 427,255 1/10/2025
1.0.199 430,920 12/27/2024
1.0.198 427,712 11/20/2024
1.0.197 430,204 11/18/2024
1.0.196 428,517 11/7/2024
1.0.195 427,921 10/19/2024
1.0.194 429,767 10/12/2024
1.0.193 430,318 10/5/2024
1.0.192 431,424 9/18/2024
1.0.191 426,715 9/17/2024
1.0.190 431,118 9/3/2024
1.0.189 426,776 9/1/2024
1.0.188 440,876 6/12/2024
1.0.187 429,627 5/28/2024
1.0.186 430,378 5/4/2024
1.0.185 429,051 4/23/2024
1.0.184 428,137 4/21/2024
1.0.183 426,957 4/14/2024
1.0.182 432,329 3/28/2024
1.0.181 426,906 3/17/2024
1.0.180 430,329 2/23/2024
1.0.179 426,929 2/23/2024
1.0.178 430,309 2/18/2024
1.0.177 426,904 2/18/2024
1.0.176 426,973 2/16/2024
1.0.175 429,070 2/13/2024
1.0.174 428,787 2/8/2024
1.0.173 429,249 2/5/2024
1.0.172 426,948 2/4/2024
1.0.171 429,500 1/23/2024
1.0.170 427,063 1/23/2024
1.0.169 428,774 1/12/2024
1.0.168 432,197 1/2/2024
1.0.167 427,291 12/29/2023
1.0.166 445,485 11/12/2023
1.0.165 838,587 11/10/2023
1.0.164 427,243 11/10/2023
1.0.163 838,277 11/9/2023
1.0.162 839,185 11/3/2023
1.0.161 838,115 11/1/2023
1.0.160 838,164 11/1/2023
1.0.159 863,527 9/8/2023
1.0.158 838,592 9/8/2023
1.0.157 838,840 9/3/2023
1.0.156 839,100 8/21/2023
1.0.155 428,507 8/14/2023
1.0.154 839,619 8/10/2023
1.0.153 879,278 6/29/2023
1.0.152 853,694 5/27/2023
1.0.151 428,194 5/21/2023
1.0.150 428,303 5/19/2023
1.0.149 864,690 5/8/2023
1.0.148 844,602 4/21/2023
1.0.147 890,318 4/3/2023
1.0.146 846,768 3/13/2023
1.0.145 858,612 3/6/2023
1.0.144 840,751 2/26/2023
1.0.143 444,689 2/21/2023
1.0.142 429,090 2/20/2023
1.0.141 430,347 2/15/2023
1.0.140 429,117 2/14/2023
1.0.139 872,572 2/9/2023
1.0.138 445,532 2/7/2023
1.0.137 840,625 2/4/2023
1.0.136 860,693 2/2/2023
1.0.135 856,969 1/30/2023
1.0.134 435,129 1/18/2023
1.0.133 884,332 12/30/2022
1.0.132 842,669 12/23/2022
1.0.131 861,094 12/12/2022
1.0.130 863,720 12/4/2022
1.0.129 841,184 12/4/2022
1.0.128 841,920 11/30/2022
1.0.127 430,299 11/29/2022
1.0.126 430,472 11/28/2022
1.0.125 845,402 11/18/2022
1.0.124 868,661 11/11/2022
1.0.123 841,455 11/11/2022
1.0.122 430,542 11/10/2022
1.0.121 841,730 11/5/2022
1.0.120 843,073 11/4/2022
1.0.119 865,174 11/1/2022
1.0.118 865,462 10/16/2022
1.0.117 848,711 9/10/2022
1.0.116 892,284 9/8/2022
1.0.115 841,985 9/8/2022
1.0.114 431,159 9/8/2022
1.0.113 844,319 9/4/2022
1.0.112 520,760 8/24/2022
1.0.111 851,390 8/8/2022
1.0.110 845,059 7/26/2022
1.0.109 842,208 7/26/2022
1.0.108 894,677 7/19/2022
1.0.107 476,205 7/18/2022
1.0.106 436,290 7/8/2022
1.0.105 846,416 6/18/2022
1.0.104 842,226 6/6/2022
1.0.103 938,790 4/30/2022
1.0.102 842,491 4/20/2022
1.0.101 842,540 4/10/2022
1.0.100 842,517 4/7/2022
1.0.99 842,437 4/7/2022
1.0.98 842,618 4/2/2022
1.0.97 443,000 3/29/2022
1.0.96 434,575 3/27/2022
1.0.95 717,734 1/24/2022
1.0.94 1,001,474 12/29/2021
1.0.93 868,735 12/20/2021
1.0.92 842,157 12/13/2021
1.0.91 898,266 12/6/2021
1.0.90 432,800 12/2/2021
1.0.89 869,851 11/29/2021
1.0.88 868,457 11/22/2021
1.0.87 429,602 11/17/2021
1.0.86 870,292 11/13/2021
1.0.85 433,044 11/10/2021
1.0.84 840,621 11/9/2021
1.0.83 492,176 11/5/2021
1.0.82 842,361 11/4/2021
1.0.81 840,500 11/4/2021
1.0.80 840,436 11/3/2021
1.0.79 840,668 10/30/2021
1.0.78 871,920 10/21/2021
1.0.77 841,101 10/17/2021
1.0.76 901,853 10/14/2021
1.0.75 851,731 10/13/2021
1.0.74 840,694 10/12/2021
1.0.73 872,341 10/11/2021
1.0.72 840,522 10/9/2021
1.0.71 875,699 10/7/2021
1.0.70 877,763 10/7/2021
1.0.69 840,636 10/7/2021
1.0.68 429,778 10/6/2021
1.0.67 840,765 9/28/2021
1.0.66 874,496 9/23/2021
1.0.65 842,387 9/10/2021
1.0.64 840,504 9/9/2021
1.0.63 840,519 9/8/2021
1.0.62 840,638 9/8/2021
1.0.61 871,402 9/6/2021
1.0.60 429,982 8/31/2021
1.0.59 429,758 8/30/2021
1.0.58 873,694 7/31/2021
1.0.57 900,210 7/30/2021
1.0.56 840,975 7/26/2021
1.0.55 929,558 7/5/2021
1.0.54 429,994 7/1/2021
1.0.53 903,086 6/4/2021
1.0.52 930,771 4/26/2021
1.0.51 871,352 4/19/2021
1.0.50 989,360 4/7/2021
1.0.49 870,561 4/3/2021
1.0.48 1,018,584 3/22/2021
1.0.47 952,418 3/4/2021
1.0.46 873,736 2/26/2021
1.0.45 1,007,716 2/2/2021
1.0.44 544,179 1/24/2021
1.0.43 430,461 1/24/2021
1.0.42 430,071 1/23/2021
1.0.41 487,512 1/20/2021
1.0.40 840,871 1/20/2021
1.0.39 458,557 1/18/2021
1.0.38 430,037 1/18/2021
1.0.37 868,020 1/16/2021
1.0.36 957,828 12/16/2020
1.0.35 895,300 12/14/2020
1.0.34 873,073 12/9/2020
1.0.33 843,167 12/6/2020
1.0.32 430,467 12/2/2020
1.0.31 841,176 12/2/2020
1.0.30 869,453 12/1/2020
1.0.29 1,029,781 11/12/2020
1.0.29-atestpub 2,480 11/11/2020
1.0.28 870,476 10/11/2020
1.0.27 952,274 9/9/2020
1.0.26 869,043 9/3/2020
1.0.25 458,773 8/20/2020
1.0.24 924,745 8/9/2020
1.0.23 459,052 7/28/2020
1.0.22 458,016 7/19/2020
1.0.21 485,211 7/6/2020
1.0.20 925,181 6/6/2020
1.0.19 870,210 6/4/2020
1.0.18 486,597 5/29/2020
1.0.17 897,396 5/21/2020
1.0.16 842,009 5/17/2020
1.0.15 896,156 5/12/2020
1.0.14 950,594 5/4/2020
1.0.13 846,096 4/24/2020
1.0.12 848,822 4/22/2020
1.0.11 841,816 4/22/2020
1.0.10 841,843 4/21/2020
1.0.9 871,002 4/18/2020
1.0.8 458,060 4/16/2020
1.0.7 430,863 4/16/2020
1.0.6 864,018 4/15/2020
1.0.5 866,608 4/11/2020
1.0.4 865,500 4/3/2020
1.0.3 430,358 4/1/2020
1.0.2 852,432 3/27/2020
1.0.1 851,456 3/22/2020
1.0.0 433,747 3/22/2020

Remove unnecessary while loop from PriorityQueue enumerator
Fix bugs in PriorityQueue, Reader, and Marshaler
Fix PriorityQueue enumerator to skip multiple consecutive empty nodes