Skip to content

Instantly share code, notes, and snippets.

@sunmeat
Created October 27, 2025 13:27
Show Gist options
  • Save sunmeat/04e128be5d804a34684e6ab9cfcce93d to your computer and use it in GitHub Desktop.
Save sunmeat/04e128be5d804a34684e6ab9cfcce93d to your computer and use it in GitHub Desktop.
special collections C#
using System;
using System.Collections;
using System.Collections.Specialized;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.IO;
using System.Text;
class Program
{
static void Main()
{
Console.OutputEncoding = Encoding.UTF8;
HybridDictionaryDemo();
ListDictionaryDemo();
NameValueCollectionDemo();
OrderedDictionaryDemo();
StringCollectionDemo();
StringDictionaryDemo();
ReadOnlyCollectionBaseDemo();
ObservableCollectionDemo();
}
static void HybridDictionaryDemo()
{
// HybridDictionary для малого/великого розміру: listdictionary -> hashtable
// HybridDictionary потрібен для оптимізації пам'яті та продуктивності
// його особливість - автоматичне перемикання між реалізаціями, залежно від кількості елементів
var hd = new HybridDictionary();
hd.Add("один", 1);
hd.Add("два", 2);
hd.Add("три", 3);
foreach (DictionaryEntry de in hd)
Console.WriteLine(de.Key + ": " + de.Value);
hd["один"] = 10; // оновлення
Console.WriteLine("оновлене 'один': " + hd["один"]);
Console.WriteLine();
}
static void ListDictionaryDemo()
{
// ListDictionary для малого числа пар ключ-значення через зв'язний список
// його особливість - ефективність при невеликій кількості елементів, за рахунок низьких накладних витрат
var ld = new ListDictionary();
ld.Add("перший", "Київ");
ld.Add("другий", "Львів");
ld.Add("третій", "Одеса");
foreach (DictionaryEntry de in ld)
Console.WriteLine(de.Key + ": " + de.Value);
ld.Remove("перший");
Console.WriteLine("після видалення 'перший': " + ld.Count); // 2
Console.WriteLine();
}
static void NameValueCollectionDemo()
{
// NameValueCollection для відсортованих пар string ключ-значення
// особливість - підтримка множинних значень для одного ключа
var nvc = new NameValueCollection();
nvc.Add("місто1", "Київ");
nvc.Add("місто2", "Львів");
nvc.Add("місто1", "Харків"); // множинні значення для ключа
Console.WriteLine("кількість ключів: " + nvc.Count); // 2
Console.WriteLine("значення для 'місто1': " + string.Join(", ", nvc.GetValues("місто1"))); // Київ, Харків
foreach (string key in nvc.AllKeys)
Console.WriteLine(key + ": " + string.Join(", ", nvc.GetValues(key)));
Console.WriteLine();
}
static void OrderedDictionaryDemo()
{
// OrderedDictionary для індексованих пар ключ-значення
// особливість - збереження порядку додавання елементів
var od = new OrderedDictionary();
od.Add("перший", "Київ");
od.Add("другий", "Львів");
od.Add("третій", "Одеса");
Console.WriteLine("за індексом 1: " + od[1]); // Львів
Console.WriteLine("за ключем 'другий': " + od["другий"]); // Львів
od.Insert(0, "нульовий", "Харків");
foreach (DictionaryEntry de in od)
Console.WriteLine(de.Key + ": " + de.Value);
Console.WriteLine();
}
static void StringCollectionDemo()
{
// StringCollection оптимізована для рядків
// особливість - типобезпечність для рядків, а також додаткові методи для роботи з рядками
var sc = new StringCollection();
sc.Add("Київ");
sc.Add("Львів");
sc.Add("Одеса");
foreach (var city in sc)
Console.WriteLine(city);
sc.Remove("Львів");
Console.WriteLine("після видалення: " + sc.Count); // 2
Console.WriteLine();
}
static void StringDictionaryDemo()
{
// StringDictionary для хеш-таблиць з рядковими ключ-значеннями
var sd = new StringDictionary();
sd.Add("місто", "Київ");
sd.Add("річка", "Дніпро");
sd.Add("гора", "Карпати");
foreach (string key in sd.Keys)
Console.WriteLine(key + ": " + sd[key]);
sd["місто"] = "Харків"; // оновлення
Console.WriteLine("оновлене 'місто': " + sd["місто"]);
Console.WriteLine();
}
static void ReadOnlyCollectionBaseDemo()
{
// ReadOnlySimpleCollection базовий для колекцій лише для читання
var rwCities = new ArrayList { "Київ", "Львів", "Одеса" };
var roCities = new ReadOnlySimpleCollection(rwCities);
foreach (string city in roCities)
Console.WriteLine(city);
Console.WriteLine();
}
static void ObservableCollectionDemo()
{
// ObservableCollection для сповіщення про зміни, для wpf/ui
var data = new ObservableCollection<string>();
data.CollectionChanged += DataCollectionChanged;
data.Add("Один");
data.Add("Два");
data.Insert(1, "Три");
data.Remove("Один");
Console.WriteLine();
}
private static void DataCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.Action == NotifyCollectionChangedAction.Add)
{
Console.WriteLine("додано: " + string.Join(", ", e.NewItems));
}
else if (e.Action == NotifyCollectionChangedAction.Remove)
{
Console.WriteLine("видалено: " + string.Join(", ", e.OldItems));
}
else if (e.Action == NotifyCollectionChangedAction.Replace)
{
Console.WriteLine("замінено: " + string.Join(", ", e.OldItems) + " на " + string.Join(", ", e.NewItems));
}
else if (e.Action == NotifyCollectionChangedAction.Move)
{
Console.WriteLine("переміщено з " + e.OldStartingIndex + " на " + e.NewStartingIndex);
}
}
}
public class ReadOnlySimpleCollection : ReadOnlyCollectionBase
{
public ReadOnlySimpleCollection(ICollection c) { InnerList.AddRange(c); }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment