Ecng.Collections 1.0.270

There is a newer version of this package available.
See the version list below for details.
dotnet add package Ecng.Collections --version 1.0.270
                    
NuGet\Install-Package Ecng.Collections -Version 1.0.270
                    
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.270" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Ecng.Collections" Version="1.0.270" />
                    
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.270
                    
#r "nuget: Ecng.Collections, 1.0.270"
                    
#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.270
                    
#: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.270
                    
Install as a Cake Addin
#tool nuget:?package=Ecng.Collections&version=1.0.270
                    
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.273 0 1/9/2026
1.0.272 1,619 1/4/2026
1.0.271 2,251 12/30/2025
1.0.270 788 12/29/2025
1.0.269 1,209 12/26/2025
1.0.268 793 12/26/2025
1.0.267 775 12/26/2025
1.0.266 795 12/26/2025
1.0.265 852 12/25/2025
1.0.264 869 12/25/2025
1.0.263 1,367 12/22/2025
1.0.262 869 12/21/2025
1.0.261 938 12/19/2025
1.0.260 897 12/19/2025
1.0.259 1,075 12/17/2025
1.0.258 1,186 12/15/2025
1.0.257 910 12/15/2025
1.0.256 878 12/14/2025
1.0.255 1,978 12/12/2025
1.0.254 1,149 12/12/2025
1.0.253 757 12/12/2025
1.0.252 761 12/12/2025
1.0.251 1,111 12/12/2025
1.0.250 48,577 12/2/2025
1.0.249 48,808 12/2/2025
1.0.248 49,579 12/2/2025
1.0.247 65,160 11/30/2025
1.0.246 68,153 11/29/2025
1.0.245 70,313 11/28/2025
1.0.244 71,024 11/28/2025
1.0.243 74,836 11/27/2025
1.0.242 94,575 11/24/2025
1.0.241 96,328 11/24/2025
1.0.240 101,091 11/23/2025
1.0.239 106,509 11/22/2025
1.0.238 124,570 11/20/2025
1.0.237 147,582 11/18/2025
1.0.236 148,269 11/18/2025
1.0.235 191,022 11/13/2025
1.0.234 223,683 11/10/2025
1.0.233 264,350 11/1/2025
1.0.232 263,590 10/28/2025
1.0.231 263,562 10/27/2025
1.0.230 263,423 10/27/2025
1.0.229 263,362 10/25/2025
1.0.228 313,826 10/3/2025
1.0.227 313,893 9/28/2025
1.0.226 313,638 9/25/2025
1.0.225 337,456 8/30/2025
1.0.224 312,115 7/13/2025
1.0.223 303,629 7/13/2025
1.0.222 303,656 7/12/2025
1.0.221 304,887 7/8/2025
1.0.220 304,447 7/4/2025
1.0.219 303,714 7/2/2025
1.0.218 308,604 6/16/2025
1.0.217 303,873 6/9/2025
1.0.216 303,744 6/8/2025
1.0.215 305,386 5/21/2025
1.0.214 303,851 5/17/2025
1.0.213 305,459 5/12/2025
1.0.212 303,773 5/12/2025
1.0.211 306,221 4/17/2025
1.0.210 308,860 3/22/2025
1.0.209 303,743 3/20/2025
1.0.208 303,686 3/20/2025
1.0.207 303,719 3/19/2025
1.0.206 308,896 2/26/2025
1.0.205 303,801 2/26/2025
1.0.204 312,217 2/5/2025
1.0.203 307,729 1/21/2025
1.0.202 307,079 1/14/2025
1.0.201 305,923 1/12/2025
1.0.200 304,361 1/10/2025
1.0.199 308,025 12/27/2024
1.0.198 304,830 11/20/2024
1.0.197 307,321 11/18/2024
1.0.196 305,643 11/7/2024
1.0.195 305,032 10/19/2024
1.0.194 306,893 10/12/2024
1.0.193 307,439 10/5/2024
1.0.192 308,546 9/18/2024
1.0.191 303,825 9/17/2024
1.0.190 308,242 9/3/2024
1.0.189 303,890 9/1/2024
1.0.188 317,992 6/12/2024
1.0.187 306,730 5/28/2024
1.0.186 307,482 5/4/2024
1.0.185 306,165 4/23/2024
1.0.184 305,244 4/21/2024
1.0.183 304,082 4/14/2024
1.0.182 309,433 3/28/2024
1.0.181 304,022 3/17/2024
1.0.180 307,434 2/23/2024
1.0.179 304,043 2/23/2024
1.0.178 307,425 2/18/2024
1.0.177 304,015 2/18/2024
1.0.176 304,090 2/16/2024
1.0.175 306,186 2/13/2024
1.0.174 305,914 2/8/2024
1.0.173 306,372 2/5/2024
1.0.172 304,073 2/4/2024
1.0.171 306,609 1/23/2024
1.0.170 304,175 1/23/2024
1.0.169 305,880 1/12/2024
1.0.168 309,301 1/2/2024
1.0.167 304,390 12/29/2023
1.0.166 322,578 11/12/2023
1.0.165 715,699 11/10/2023
1.0.164 304,355 11/10/2023
1.0.163 715,396 11/9/2023
1.0.162 716,290 11/3/2023
1.0.161 715,227 11/1/2023
1.0.160 715,278 11/1/2023
1.0.159 740,634 9/8/2023
1.0.158 715,701 9/8/2023
1.0.157 715,945 9/3/2023
1.0.156 716,215 8/21/2023
1.0.155 305,621 8/14/2023
1.0.154 716,740 8/10/2023
1.0.153 756,390 6/29/2023
1.0.152 730,808 5/27/2023
1.0.151 305,309 5/21/2023
1.0.150 305,419 5/19/2023
1.0.149 741,795 5/8/2023
1.0.148 721,728 4/21/2023
1.0.147 767,420 4/3/2023
1.0.146 723,896 3/13/2023
1.0.145 735,737 3/6/2023
1.0.144 717,865 2/26/2023
1.0.143 321,805 2/21/2023
1.0.142 306,209 2/20/2023
1.0.141 307,472 2/15/2023
1.0.140 306,219 2/14/2023
1.0.139 749,710 2/9/2023
1.0.138 322,648 2/7/2023
1.0.137 717,750 2/4/2023
1.0.136 737,816 2/2/2023
1.0.135 734,106 1/30/2023
1.0.134 312,243 1/18/2023
1.0.133 761,465 12/30/2022
1.0.132 719,781 12/23/2022
1.0.131 738,219 12/12/2022
1.0.130 740,840 12/4/2022
1.0.129 718,290 12/4/2022
1.0.128 719,041 11/30/2022
1.0.127 307,428 11/29/2022
1.0.126 307,600 11/28/2022
1.0.125 722,520 11/18/2022
1.0.124 745,786 11/11/2022
1.0.123 718,567 11/11/2022
1.0.122 307,668 11/10/2022
1.0.121 718,844 11/5/2022
1.0.120 720,191 11/4/2022
1.0.119 742,286 11/1/2022
1.0.118 742,582 10/16/2022
1.0.117 725,829 9/10/2022
1.0.116 769,394 9/8/2022
1.0.115 719,100 9/8/2022
1.0.114 308,276 9/8/2022
1.0.113 721,433 9/4/2022
1.0.112 397,872 8/24/2022
1.0.111 728,504 8/8/2022
1.0.110 722,172 7/26/2022
1.0.109 719,317 7/26/2022
1.0.108 771,792 7/19/2022
1.0.107 353,325 7/18/2022
1.0.106 313,404 7/8/2022
1.0.105 723,525 6/18/2022
1.0.104 719,338 6/6/2022
1.0.103 815,890 4/30/2022
1.0.102 719,601 4/20/2022
1.0.101 719,660 4/10/2022
1.0.100 719,632 4/7/2022
1.0.99 719,553 4/7/2022
1.0.98 719,746 4/2/2022
1.0.97 320,113 3/29/2022
1.0.96 311,694 3/27/2022
1.0.95 594,791 1/24/2022
1.0.94 878,580 12/29/2021
1.0.93 745,854 12/20/2021
1.0.92 719,267 12/13/2021
1.0.91 775,390 12/6/2021
1.0.90 309,906 12/2/2021
1.0.89 746,982 11/29/2021
1.0.88 745,574 11/22/2021
1.0.87 306,724 11/17/2021
1.0.86 747,402 11/13/2021
1.0.85 310,167 11/10/2021
1.0.84 717,736 11/9/2021
1.0.83 369,298 11/5/2021
1.0.82 719,465 11/4/2021
1.0.81 717,629 11/4/2021
1.0.80 717,539 11/3/2021
1.0.79 717,784 10/30/2021
1.0.78 749,031 10/21/2021
1.0.77 718,212 10/17/2021
1.0.76 778,967 10/14/2021
1.0.75 728,845 10/13/2021
1.0.74 717,809 10/12/2021
1.0.73 749,440 10/11/2021
1.0.72 717,640 10/9/2021
1.0.71 752,804 10/7/2021
1.0.70 754,876 10/7/2021
1.0.69 717,755 10/7/2021
1.0.68 306,893 10/6/2021
1.0.67 717,883 9/28/2021
1.0.66 751,609 9/23/2021
1.0.65 719,512 9/10/2021
1.0.64 717,615 9/9/2021
1.0.63 717,634 9/8/2021
1.0.62 717,748 9/8/2021
1.0.61 748,519 9/6/2021
1.0.60 307,103 8/31/2021
1.0.59 306,874 8/30/2021
1.0.58 750,814 7/31/2021
1.0.57 777,328 7/30/2021
1.0.56 718,091 7/26/2021
1.0.55 806,672 7/5/2021
1.0.54 307,110 7/1/2021
1.0.53 780,194 6/4/2021
1.0.52 807,887 4/26/2021
1.0.51 748,466 4/19/2021
1.0.50 866,467 4/7/2021
1.0.49 747,673 4/3/2021
1.0.48 895,664 3/22/2021
1.0.47 829,535 3/4/2021
1.0.46 750,845 2/26/2021
1.0.45 884,820 2/2/2021
1.0.44 421,277 1/24/2021
1.0.43 307,574 1/24/2021
1.0.42 307,197 1/23/2021
1.0.41 364,607 1/20/2021
1.0.40 717,986 1/20/2021
1.0.39 335,665 1/18/2021
1.0.38 307,148 1/18/2021
1.0.37 745,136 1/16/2021
1.0.36 834,952 12/16/2020
1.0.35 772,421 12/14/2020
1.0.34 750,195 12/9/2020
1.0.33 720,273 12/6/2020
1.0.32 307,583 12/2/2020
1.0.31 718,304 12/2/2020
1.0.30 746,570 12/1/2020
1.0.29 906,890 11/12/2020
1.0.29-atestpub 2,473 11/11/2020
1.0.28 747,589 10/11/2020
1.0.27 829,363 9/9/2020
1.0.26 746,146 9/3/2020
1.0.25 335,893 8/20/2020
1.0.24 801,856 8/9/2020
1.0.23 336,174 7/28/2020
1.0.22 335,129 7/19/2020
1.0.21 362,333 7/6/2020
1.0.20 802,290 6/6/2020
1.0.19 747,332 6/4/2020
1.0.18 363,703 5/29/2020
1.0.17 774,513 5/21/2020
1.0.16 719,124 5/17/2020
1.0.15 773,275 5/12/2020
1.0.14 827,695 5/4/2020
1.0.13 723,205 4/24/2020
1.0.12 725,919 4/22/2020
1.0.11 718,920 4/22/2020
1.0.10 718,956 4/21/2020
1.0.9 748,118 4/18/2020
1.0.8 335,171 4/16/2020
1.0.7 307,974 4/16/2020
1.0.6 741,115 4/15/2020
1.0.5 743,720 4/11/2020
1.0.4 742,611 4/3/2020
1.0.3 307,468 4/1/2020
1.0.2 729,533 3/27/2020
1.0.1 728,570 3/22/2020
1.0.0 310,845 3/22/2020