Created
October 27, 2025 13:27
-
-
Save sunmeat/04e128be5d804a34684e6ab9cfcce93d to your computer and use it in GitHub Desktop.
special collections C#
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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