Ecng.Collections 1.0.283

There is a newer version of this package available.
See the version list below for details.
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.285 493 2/4/2026
1.0.284 1,670 2/1/2026
1.0.283 1,676 1/26/2026
1.0.282 866 1/22/2026
1.0.281 2,111 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 2,945 1/9/2026
1.0.273 4,124 1/9/2026
1.0.272 27,111 1/4/2026
1.0.271 44,180 12/30/2025
1.0.270 46,739 12/29/2025
1.0.269 65,226 12/26/2025
1.0.268 65,237 12/26/2025
1.0.267 65,281 12/26/2025
1.0.266 65,290 12/26/2025
1.0.265 70,778 12/25/2025
1.0.264 72,045 12/25/2025
1.0.263 88,749 12/22/2025
1.0.262 95,758 12/21/2025
1.0.261 104,064 12/19/2025
1.0.260 104,737 12/19/2025
1.0.259 113,114 12/17/2025
1.0.258 127,700 12/15/2025
1.0.257 127,599 12/15/2025
1.0.256 133,866 12/14/2025
1.0.255 154,680 12/12/2025
1.0.254 153,990 12/12/2025
1.0.253 153,616 12/12/2025
1.0.252 153,613 12/12/2025
1.0.251 154,361 12/12/2025
1.0.250 217,504 12/2/2025
1.0.249 217,726 12/2/2025
1.0.248 218,503 12/2/2025
1.0.247 234,069 11/30/2025
1.0.246 237,072 11/29/2025
1.0.245 239,236 11/28/2025
1.0.244 239,946 11/28/2025
1.0.243 243,755 11/27/2025
1.0.242 263,503 11/24/2025
1.0.241 265,247 11/24/2025
1.0.240 270,024 11/23/2025
1.0.239 275,436 11/22/2025
1.0.238 293,555 11/20/2025
1.0.237 316,526 11/18/2025
1.0.236 317,206 11/18/2025
1.0.235 359,958 11/13/2025
1.0.234 392,612 11/10/2025
1.0.233 433,263 11/1/2025
1.0.232 432,517 10/28/2025
1.0.231 432,482 10/27/2025
1.0.230 432,344 10/27/2025
1.0.229 432,276 10/25/2025
1.0.228 482,740 10/3/2025
1.0.227 482,807 9/28/2025
1.0.226 482,550 9/25/2025
1.0.225 506,928 8/30/2025
1.0.224 481,147 7/13/2025
1.0.223 472,544 7/13/2025
1.0.222 472,567 7/12/2025
1.0.221 473,904 7/8/2025
1.0.220 473,356 7/4/2025
1.0.219 472,640 7/2/2025
1.0.218 477,522 6/16/2025
1.0.217 472,796 6/9/2025
1.0.216 472,655 6/8/2025
1.0.215 474,306 5/21/2025
1.0.214 472,780 5/17/2025
1.0.213 474,366 5/12/2025
1.0.212 472,692 5/12/2025
1.0.211 475,200 4/17/2025
1.0.210 477,789 3/22/2025
1.0.209 472,667 3/20/2025
1.0.208 472,599 3/20/2025
1.0.207 472,639 3/19/2025
1.0.206 477,829 2/26/2025
1.0.205 472,729 2/26/2025
1.0.204 481,148 2/5/2025
1.0.203 476,649 1/21/2025
1.0.202 476,011 1/14/2025
1.0.201 474,835 1/12/2025
1.0.200 473,289 1/10/2025
1.0.199 476,973 12/27/2024
1.0.198 473,740 11/20/2024
1.0.197 476,243 11/18/2024
1.0.196 474,554 11/7/2024
1.0.195 473,954 10/19/2024
1.0.194 475,795 10/12/2024
1.0.193 476,352 10/5/2024
1.0.192 477,462 9/18/2024
1.0.191 472,745 9/17/2024
1.0.190 477,156 9/3/2024
1.0.189 472,812 9/1/2024
1.0.188 486,912 6/12/2024
1.0.187 475,666 5/28/2024
1.0.186 476,413 5/4/2024
1.0.185 475,088 4/23/2024
1.0.184 474,173 4/21/2024
1.0.183 472,998 4/14/2024
1.0.182 478,359 3/28/2024
1.0.181 472,942 3/17/2024
1.0.180 476,370 2/23/2024
1.0.179 472,962 2/23/2024
1.0.178 476,336 2/18/2024
1.0.177 472,956 2/18/2024
1.0.176 473,014 2/16/2024
1.0.175 475,096 2/13/2024
1.0.174 474,819 2/8/2024
1.0.173 475,280 2/5/2024
1.0.172 472,980 2/4/2024
1.0.171 475,534 1/23/2024
1.0.170 473,111 1/23/2024
1.0.169 474,805 1/12/2024
1.0.168 478,246 1/2/2024
1.0.167 473,334 12/29/2023
1.0.166 491,514 11/12/2023
1.0.165 884,625 11/10/2023
1.0.164 473,284 11/10/2023
1.0.163 884,319 11/9/2023
1.0.162 885,227 11/3/2023
1.0.161 884,152 11/1/2023
1.0.160 884,200 11/1/2023
1.0.159 909,561 9/8/2023
1.0.158 884,619 9/8/2023
1.0.157 884,879 9/3/2023
1.0.156 885,136 8/21/2023
1.0.155 474,540 8/14/2023
1.0.154 885,657 8/10/2023
1.0.153 925,314 6/29/2023
1.0.152 899,730 5/27/2023
1.0.151 474,229 5/21/2023
1.0.150 474,335 5/19/2023
1.0.149 910,722 5/8/2023
1.0.148 890,631 4/21/2023
1.0.147 936,348 4/3/2023
1.0.146 892,797 3/13/2023
1.0.145 904,646 3/6/2023
1.0.144 886,781 2/26/2023
1.0.143 490,715 2/21/2023
1.0.142 475,132 2/20/2023
1.0.141 476,386 2/15/2023
1.0.140 475,152 2/14/2023
1.0.139 918,608 2/9/2023
1.0.138 491,567 2/7/2023
1.0.137 886,660 2/4/2023
1.0.136 906,724 2/2/2023
1.0.135 903,009 1/30/2023
1.0.134 481,170 1/18/2023
1.0.133 930,391 12/30/2022
1.0.132 888,713 12/23/2022
1.0.131 907,123 12/12/2022
1.0.130 909,762 12/4/2022
1.0.129 887,221 12/4/2022
1.0.128 887,951 11/30/2022
1.0.127 476,345 11/29/2022
1.0.126 476,511 11/28/2022
1.0.125 891,440 11/18/2022
1.0.124 914,705 11/11/2022
1.0.123 887,490 11/11/2022
1.0.122 476,578 11/10/2022
1.0.121 887,765 11/5/2022
1.0.120 889,110 11/4/2022
1.0.119 911,214 11/1/2022
1.0.118 911,500 10/16/2022
1.0.117 894,749 9/10/2022
1.0.116 938,325 9/8/2022
1.0.115 888,019 9/8/2022
1.0.114 477,202 9/8/2022
1.0.113 890,350 9/4/2022
1.0.112 566,798 8/24/2022
1.0.111 897,421 8/8/2022
1.0.110 891,094 7/26/2022
1.0.109 888,243 7/26/2022
1.0.108 940,707 7/19/2022
1.0.107 522,258 7/18/2022
1.0.106 482,326 7/8/2022
1.0.105 892,446 6/18/2022
1.0.104 888,261 6/6/2022
1.0.103 984,820 4/30/2022
1.0.102 888,512 4/20/2022
1.0.101 888,564 4/10/2022
1.0.100 888,553 4/7/2022
1.0.99 888,468 4/7/2022
1.0.98 888,652 4/2/2022
1.0.97 489,042 3/29/2022
1.0.96 480,606 3/27/2022
1.0.95 763,847 1/24/2022
1.0.94 1,047,506 12/29/2021
1.0.93 914,772 12/20/2021
1.0.92 888,189 12/13/2021
1.0.91 944,301 12/6/2021
1.0.90 478,826 12/2/2021
1.0.89 915,891 11/29/2021
1.0.88 914,485 11/22/2021
1.0.87 475,636 11/17/2021
1.0.86 916,336 11/13/2021
1.0.85 479,081 11/10/2021
1.0.84 886,656 11/9/2021
1.0.83 538,208 11/5/2021
1.0.82 888,396 11/4/2021
1.0.81 886,529 11/4/2021
1.0.80 886,467 11/3/2021
1.0.79 886,696 10/30/2021
1.0.78 917,953 10/21/2021
1.0.77 887,133 10/17/2021
1.0.76 947,892 10/14/2021
1.0.75 897,769 10/13/2021
1.0.74 886,728 10/12/2021
1.0.73 918,371 10/11/2021
1.0.72 886,558 10/9/2021
1.0.71 921,746 10/7/2021
1.0.70 923,795 10/7/2021
1.0.69 886,672 10/7/2021
1.0.68 475,815 10/6/2021
1.0.67 886,795 9/28/2021
1.0.66 920,534 9/23/2021
1.0.65 888,424 9/10/2021
1.0.64 886,542 9/9/2021
1.0.63 886,556 9/8/2021
1.0.62 886,678 9/8/2021
1.0.61 917,439 9/6/2021
1.0.60 476,021 8/31/2021
1.0.59 475,789 8/30/2021
1.0.58 919,731 7/31/2021
1.0.57 946,242 7/30/2021
1.0.56 887,002 7/26/2021
1.0.55 975,586 7/5/2021
1.0.54 476,020 7/1/2021
1.0.53 949,114 6/4/2021
1.0.52 976,799 4/26/2021
1.0.51 917,388 4/19/2021
1.0.50 1,035,397 4/7/2021
1.0.49 916,600 4/3/2021
1.0.48 1,064,622 3/22/2021
1.0.47 998,454 3/4/2021
1.0.46 919,776 2/26/2021
1.0.45 1,053,739 2/2/2021
1.0.44 590,231 1/24/2021
1.0.43 476,504 1/24/2021
1.0.42 476,118 1/23/2021
1.0.41 533,556 1/20/2021
1.0.40 886,913 1/20/2021
1.0.39 504,597 1/18/2021
1.0.38 476,080 1/18/2021
1.0.37 914,052 1/16/2021
1.0.36 1,003,870 12/16/2020
1.0.35 941,325 12/14/2020
1.0.34 919,100 12/9/2020
1.0.33 889,196 12/6/2020
1.0.32 476,502 12/2/2020
1.0.31 887,208 12/2/2020
1.0.30 915,492 12/1/2020
1.0.29 1,075,827 11/12/2020
1.0.29-atestpub 2,483 11/11/2020
1.0.28 916,528 10/11/2020
1.0.27 998,310 9/9/2020
1.0.26 915,085 9/3/2020
1.0.25 504,812 8/20/2020
1.0.24 970,777 8/9/2020
1.0.23 505,093 7/28/2020
1.0.22 504,053 7/19/2020
1.0.21 531,242 7/6/2020
1.0.20 971,220 6/6/2020
1.0.19 916,250 6/4/2020
1.0.18 532,640 5/29/2020
1.0.17 943,432 5/21/2020
1.0.16 888,056 5/17/2020
1.0.15 942,186 5/12/2020
1.0.14 996,630 5/4/2020
1.0.13 892,133 4/24/2020
1.0.12 894,856 4/22/2020
1.0.11 887,850 4/22/2020
1.0.10 887,879 4/21/2020
1.0.9 917,032 4/18/2020
1.0.8 504,095 4/16/2020
1.0.7 476,909 4/16/2020
1.0.6 910,057 4/15/2020
1.0.5 912,648 4/11/2020
1.0.4 911,547 4/3/2020
1.0.3 476,400 4/1/2020
1.0.2 898,483 3/27/2020
1.0.1 897,493 3/22/2020
1.0.0 479,777 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