Ecng.Collections 1.0.280

There is a newer version of this package available.
See the version list below for details.
dotnet add package Ecng.Collections --version 1.0.280
                    
NuGet\Install-Package Ecng.Collections -Version 1.0.280
                    
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.280" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Ecng.Collections" Version="1.0.280" />
                    
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.280
                    
#r "nuget: Ecng.Collections, 1.0.280"
                    
#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.280
                    
#: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.280
                    
Install as a Cake Addin
#tool nuget:?package=Ecng.Collections&version=1.0.280
                    
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 438 1/19/2026
1.0.280 397 1/19/2026
1.0.279 408 1/18/2026
1.0.278 395 1/18/2026
1.0.277 1,021 1/14/2026
1.0.276 799 1/13/2026
1.0.275 782 1/13/2026
1.0.274 1,241 1/9/2026
1.0.273 883 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 805 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 878 12/21/2025
1.0.261 7,906 12/19/2025
1.0.260 8,558 12/19/2025
1.0.259 16,936 12/17/2025
1.0.258 31,517 12/15/2025
1.0.257 31,427 12/15/2025
1.0.256 37,680 12/14/2025
1.0.255 58,502 12/12/2025
1.0.254 57,816 12/12/2025
1.0.253 57,426 12/12/2025
1.0.252 57,428 12/12/2025
1.0.251 58,167 12/12/2025
1.0.250 121,316 12/2/2025
1.0.249 121,545 12/2/2025
1.0.248 122,318 12/2/2025
1.0.247 137,900 11/30/2025
1.0.246 140,884 11/29/2025
1.0.245 143,064 11/28/2025
1.0.244 143,764 11/28/2025
1.0.243 147,583 11/27/2025
1.0.242 167,318 11/24/2025
1.0.241 169,069 11/24/2025
1.0.240 173,835 11/23/2025
1.0.239 179,253 11/22/2025
1.0.238 197,340 11/20/2025
1.0.237 220,338 11/18/2025
1.0.236 221,015 11/18/2025
1.0.235 263,767 11/13/2025
1.0.234 296,431 11/10/2025
1.0.233 337,089 11/1/2025
1.0.232 336,338 10/28/2025
1.0.231 336,303 10/27/2025
1.0.230 336,168 10/27/2025
1.0.229 336,104 10/25/2025
1.0.228 386,563 10/3/2025
1.0.227 386,640 9/28/2025
1.0.226 386,373 9/25/2025
1.0.225 410,351 8/30/2025
1.0.224 384,866 7/13/2025
1.0.223 376,369 7/13/2025
1.0.222 376,391 7/12/2025
1.0.221 377,655 7/8/2025
1.0.220 377,182 7/4/2025
1.0.219 376,461 7/2/2025
1.0.218 381,343 6/16/2025
1.0.217 376,615 6/9/2025
1.0.216 376,478 6/8/2025
1.0.215 378,120 5/21/2025
1.0.214 376,589 5/17/2025
1.0.213 378,192 5/12/2025
1.0.212 376,508 5/12/2025
1.0.211 378,963 4/17/2025
1.0.210 381,605 3/22/2025
1.0.209 376,475 3/20/2025
1.0.208 376,414 3/20/2025
1.0.207 376,460 3/19/2025
1.0.206 381,643 2/26/2025
1.0.205 376,542 2/26/2025
1.0.204 384,970 2/5/2025
1.0.203 380,465 1/21/2025
1.0.202 379,819 1/14/2025
1.0.201 378,655 1/12/2025
1.0.200 377,104 1/10/2025
1.0.199 380,765 12/27/2024
1.0.198 377,569 11/20/2024
1.0.197 380,049 11/18/2024
1.0.196 378,378 11/7/2024
1.0.195 377,767 10/19/2024
1.0.194 379,624 10/12/2024
1.0.193 380,170 10/5/2024
1.0.192 381,275 9/18/2024
1.0.191 376,560 9/17/2024
1.0.190 380,973 9/3/2024
1.0.189 376,624 9/1/2024
1.0.188 390,732 6/12/2024
1.0.187 379,474 5/28/2024
1.0.186 380,226 5/4/2024
1.0.185 378,907 4/23/2024
1.0.184 377,991 4/21/2024
1.0.183 376,814 4/14/2024
1.0.182 382,180 3/28/2024
1.0.181 376,760 3/17/2024
1.0.180 380,181 2/23/2024
1.0.179 376,782 2/23/2024
1.0.178 380,164 2/18/2024
1.0.177 376,751 2/18/2024
1.0.176 376,827 2/16/2024
1.0.175 378,922 2/13/2024
1.0.174 378,643 2/8/2024
1.0.173 379,105 2/5/2024
1.0.172 376,801 2/4/2024
1.0.171 379,346 1/23/2024
1.0.170 376,915 1/23/2024
1.0.169 378,619 1/12/2024
1.0.168 382,040 1/2/2024
1.0.167 377,133 12/29/2023
1.0.166 395,321 11/12/2023
1.0.165 788,436 11/10/2023
1.0.164 377,099 11/10/2023
1.0.163 788,131 11/9/2023
1.0.162 789,026 11/3/2023
1.0.161 787,961 11/1/2023
1.0.160 788,017 11/1/2023
1.0.159 813,369 9/8/2023
1.0.158 788,439 9/8/2023
1.0.157 788,685 9/3/2023
1.0.156 788,947 8/21/2023
1.0.155 378,354 8/14/2023
1.0.154 789,472 8/10/2023
1.0.153 829,125 6/29/2023
1.0.152 803,541 5/27/2023
1.0.151 378,042 5/21/2023
1.0.150 378,153 5/19/2023
1.0.149 814,531 5/8/2023
1.0.148 794,455 4/21/2023
1.0.147 840,162 4/3/2023
1.0.146 796,625 3/13/2023
1.0.145 808,466 3/6/2023
1.0.144 790,606 2/26/2023
1.0.143 394,540 2/21/2023
1.0.142 378,945 2/20/2023
1.0.141 380,204 2/15/2023
1.0.140 378,960 2/14/2023
1.0.139 822,436 2/9/2023
1.0.138 395,377 2/7/2023
1.0.137 790,485 2/4/2023
1.0.136 810,547 2/2/2023
1.0.135 806,836 1/30/2023
1.0.134 384,983 1/18/2023
1.0.133 834,192 12/30/2022
1.0.132 792,522 12/23/2022
1.0.131 810,951 12/12/2022
1.0.130 813,573 12/4/2022
1.0.129 791,031 12/4/2022
1.0.128 791,780 11/30/2022
1.0.127 380,164 11/29/2022
1.0.126 380,334 11/28/2022
1.0.125 795,256 11/18/2022
1.0.124 818,519 11/11/2022
1.0.123 791,309 11/11/2022
1.0.122 380,401 11/10/2022
1.0.121 791,585 11/5/2022
1.0.120 792,925 11/4/2022
1.0.119 815,031 11/1/2022
1.0.118 815,324 10/16/2022
1.0.117 798,569 9/10/2022
1.0.116 842,142 9/8/2022
1.0.115 791,830 9/8/2022
1.0.114 381,013 9/8/2022
1.0.113 794,174 9/4/2022
1.0.112 470,610 8/24/2022
1.0.111 801,244 8/8/2022
1.0.110 794,906 7/26/2022
1.0.109 792,059 7/26/2022
1.0.108 844,524 7/19/2022
1.0.107 426,060 7/18/2022
1.0.106 386,139 7/8/2022
1.0.105 796,262 6/18/2022
1.0.104 792,082 6/6/2022
1.0.103 888,633 4/30/2022
1.0.102 792,340 4/20/2022
1.0.101 792,389 4/10/2022
1.0.100 792,364 4/7/2022
1.0.99 792,285 4/7/2022
1.0.98 792,472 4/2/2022
1.0.97 392,851 3/29/2022
1.0.96 384,429 3/27/2022
1.0.95 667,555 1/24/2022
1.0.94 951,311 12/29/2021
1.0.93 818,590 12/20/2021
1.0.92 792,008 12/13/2021
1.0.91 848,122 12/6/2021
1.0.90 382,654 12/2/2021
1.0.89 819,711 11/29/2021
1.0.88 818,311 11/22/2021
1.0.87 379,462 11/17/2021
1.0.86 820,141 11/13/2021
1.0.85 382,899 11/10/2021
1.0.84 790,469 11/9/2021
1.0.83 442,032 11/5/2021
1.0.82 792,207 11/4/2021
1.0.81 790,362 11/4/2021
1.0.80 790,278 11/3/2021
1.0.79 790,519 10/30/2021
1.0.78 821,765 10/21/2021
1.0.77 790,947 10/17/2021
1.0.76 851,700 10/14/2021
1.0.75 801,585 10/13/2021
1.0.74 790,536 10/12/2021
1.0.73 822,190 10/11/2021
1.0.72 790,367 10/9/2021
1.0.71 825,545 10/7/2021
1.0.70 827,606 10/7/2021
1.0.69 790,493 10/7/2021
1.0.68 379,625 10/6/2021
1.0.67 790,619 9/28/2021
1.0.66 824,346 9/23/2021
1.0.65 792,240 9/10/2021
1.0.64 790,353 9/9/2021
1.0.63 790,362 9/8/2021
1.0.62 790,485 9/8/2021
1.0.61 821,248 9/6/2021
1.0.60 379,833 8/31/2021
1.0.59 379,608 8/30/2021
1.0.58 823,544 7/31/2021
1.0.57 850,060 7/30/2021
1.0.56 790,823 7/26/2021
1.0.55 879,401 7/5/2021
1.0.54 379,846 7/1/2021
1.0.53 852,928 6/4/2021
1.0.52 880,625 4/26/2021
1.0.51 821,193 4/19/2021
1.0.50 939,203 4/7/2021
1.0.49 820,405 4/3/2021
1.0.48 968,408 3/22/2021
1.0.47 902,268 3/4/2021
1.0.46 823,575 2/26/2021
1.0.45 957,561 2/2/2021
1.0.44 494,028 1/24/2021
1.0.43 380,309 1/24/2021
1.0.42 379,920 1/23/2021
1.0.41 437,356 1/20/2021
1.0.40 790,717 1/20/2021
1.0.39 408,405 1/18/2021
1.0.38 379,886 1/18/2021
1.0.37 817,871 1/16/2021
1.0.36 907,680 12/16/2020
1.0.35 845,149 12/14/2020
1.0.34 822,923 12/9/2020
1.0.33 793,000 12/6/2020
1.0.32 380,310 12/2/2020
1.0.31 791,033 12/2/2020
1.0.30 819,305 12/1/2020
1.0.29 979,627 11/12/2020
1.0.29-atestpub 2,475 11/11/2020
1.0.28 820,325 10/11/2020
1.0.27 902,102 9/9/2020
1.0.26 818,889 9/3/2020
1.0.25 408,623 8/20/2020
1.0.24 874,586 8/9/2020
1.0.23 408,903 7/28/2020
1.0.22 407,856 7/19/2020
1.0.21 435,062 7/6/2020
1.0.20 875,030 6/6/2020
1.0.19 820,063 6/4/2020
1.0.18 436,441 5/29/2020
1.0.17 847,244 5/21/2020
1.0.16 791,855 5/17/2020
1.0.15 846,009 5/12/2020
1.0.14 900,439 5/4/2020
1.0.13 795,939 4/24/2020
1.0.12 798,657 4/22/2020
1.0.11 791,669 4/22/2020
1.0.10 791,687 4/21/2020
1.0.9 820,850 4/18/2020
1.0.8 407,903 4/16/2020
1.0.7 380,716 4/16/2020
1.0.6 813,860 4/15/2020
1.0.5 816,457 4/11/2020
1.0.4 815,345 4/3/2020
1.0.3 380,201 4/1/2020
1.0.2 802,274 3/27/2020
1.0.1 801,311 3/22/2020
1.0.0 383,593 3/22/2020