static void Main(string[] args) { // В проекте CompositeKeyCollection имеется 3 реализации класса коллекций с композитными (составными) ключами: // 1. CompositeKeyCollection<TKey1, Tkey2, TData> - обычная обобщенная реализация класса коллекции (не потокобезопасная) // 2. ThreadSafeCompositeKeyCollection<Tkey1, Tkey2, TData> - потокобезопасная реализация класса CompositeKeyCollection<TKey1, TKey2, TData> // 3. TransactionalCompositeKeyCollection<TKey1, TKey2, TData> - класс коллекции с комопозитными ключами и поддержкой транзакционности на операции вставки и удаления записей в коллекцию (PS.: пока еще не потокобезопасная) // Примеры использования коллекций: // 1. CompositeKeyCollection<TKey1, Tkey2, TData> var currentDate = DateTime.Today; var tasksDoneCollection1 = new CompositeKeyCollection <UserType, string, int>(); tasksDoneCollection1.Add(new UserType(currentDate), "Developers", 10); tasksDoneCollection1.Add(new UserType(currentDate), "Managers", 12); tasksDoneCollection1.Add(new UserType(currentDate.AddDays(1)), "Developers", 7); PrintCollection(tasksDoneCollection1); var key1 = new UserType(currentDate); var key2 = "Developers"; tasksDoneCollection1.Remove(key1, key2); PrintCollection(tasksDoneCollection1); key1 = new UserType(currentDate.AddDays(1)); var items = tasksDoneCollection1.Find(key1, key2); Console.WriteLine("Items found: {0}", items.Count); var value = tasksDoneCollection1[key1, key2]; Console.WriteLine("Value in dictionary: {0}", value); tasksDoneCollection1.Clear(); // 2. ThreadSafeCompositeKeyCollection<Tkey1, Tkey2, TData> _collection2 = new ThreadSafeCompositeKeyCollection <UserType, string, int>(); Task.Run(() => RunFirstWriteThread()); Task.Run(() => RunSecondWriteThread()); Task.Run(() => RunShowKeyCountThread()); // 3.TransactionalDictionary<TKey1, TKey2, TData> var collection3 = new TransactionalCompositeKeyCollection <UserType, string, int>(); collection3.Add(new UserType(DateTime.Today), "Managers", 10); collection3.Add(new UserType(DateTime.Today), "Analitics", 15); // adding an invalid object to the collection try { collection3.Add(null, "Developers", 20); } catch (ArgumentNullException ex) { } Console.Read(); }
public void UpdateCollectionConcurentlyTest() { _concurentCollection = new ThreadSafeCompositeKeyCollection <UserType, string, int>(); Task.Run(() => RunFirstWriteThread()).Wait(); Task.Run(() => RunSecondWriteThread()).Wait(); Task.Run(() => RunThirdWriteThread()).Wait(); Task.Run(() => RunFirstReadThread()).Wait(); Task.Run(() => RunSecondReadThread()).Wait(); Task.Run(() => RunFirstRemovingThread()).Wait(); }
public void LinqComparisonTest() { _thSafeCollection = new ThreadSafeCompositeKeyCollection <int, DateTime, string>(); _kvpDictionary = new Dictionary <KeyValuePair <int, DateTime>, string>(); Random rnd = new Random(); DateTime dt = DateTime.Today; string value = "Developers"; for (int idx = 0; idx < 100000; idx++) { var datetime = dt.AddDays(-idx); _kvpDictionary.Add(new KeyValuePair <int, DateTime>(idx, datetime), value); _thSafeCollection.Add(idx, datetime, value); } int key1 = 55000; DateTime key2 = DateTime.Today.AddDays(-55000); var customCollectionSearchTime = CountSearchTimeOnCustomCollection(key1, key2); var dictionaryCollectionSearchTime = CountSearchTimeOnDictionary(key1, key2); dt = new DateTime(1900, 01, 01); for (int idx = 0; idx < 100000; idx++) { var datetime = dt.AddDays(idx); value = "Managers"; _kvpDictionary.Add(new KeyValuePair <int, DateTime>(idx, datetime), value); _thSafeCollection.Add(idx, datetime, value); } var customCollectionSearchTime2 = CountSearchTimeOnCustomCollection(key1, key2); var dictionaryCollectionSearchTime2 = CountSearchTimeOnDictionary(key1, key2); dt = new DateTime(1500, 01, 01); for (int idx = 0; idx < 100000; idx++) { var datetime = dt.AddMinutes(idx); value = "Testers"; _kvpDictionary.Add(new KeyValuePair <int, DateTime>(idx, datetime), value); _thSafeCollection.Add(idx, datetime, value); } var customCollectionSearchTime3 = CountSearchTimeOnCustomCollection(key1, key2); var dictionaryCollectionSearchTime3 = CountSearchTimeOnDictionary(key1, key2); dt = new DateTime(2200, 01, 01); for (int idx = 0; idx < 100000; idx++) { var datetime = dt.AddMinutes(idx); value = "Analytics"; _kvpDictionary.Add(new KeyValuePair <int, DateTime>(idx, datetime), value); _thSafeCollection.Add(idx, datetime, value); } var customCollectionSearchTime4 = CountSearchTimeOnCustomCollection(key1, key2); var dictionaryCollectionSearchTime4 = CountSearchTimeOnDictionary(key1, key2); Debug.WriteLine("customCollectionSearchTime = {0}", customCollectionSearchTime); Debug.WriteLine("dictionaryCollectionSearchTime = {0}", dictionaryCollectionSearchTime); Debug.WriteLine("customCollectionSearchTime2 = {0}", customCollectionSearchTime2); Debug.WriteLine("dictionaryCollectionSearchTime2 = {0}", dictionaryCollectionSearchTime2); Debug.WriteLine("customCollectionSearchTime3 = {0}", customCollectionSearchTime3); Debug.WriteLine("dictionaryCollectionSearchTime3 = {0}", dictionaryCollectionSearchTime3); Debug.WriteLine("customCollectionSearchTime4 = {0}", customCollectionSearchTime4); Debug.WriteLine("dictionaryCollectionSearchTime4 = {0}", dictionaryCollectionSearchTime4); }