Esempio n. 1
0
 public bool Remove(DoubleKey <TKey1, TKey2> key)
 {
     lock (locker)
     {
         return(_dictionary.Remove(key));
     }
 }
Esempio n. 2
0
        public static void DictionaryTest1()
        {
            var dd = new DoubleKeyDictionary <string, UserKey <string>, int>
            {
                { "Ivan", new UserKey <string>("Ivanov"), 1000 },
                { "Ivan", new UserKey <string>("Kozlov"), 800 },
                { "Ivan", new UserKey <string>("Sukhov"), 450 },
                { "Peter", new UserKey <string>("Ivanov"), 1560 },
                { "Peter", new UserKey <string>("Kozlov"), 1200 },
                { "Peter", new UserKey <string>("Sukhov"), 0 }
            };

            //Перегруженный ToString()
            Console.WriteLine(dd);

            var key1 = "Peter";
            var key2 = new UserKey <string>("Sukhov");
            var key  = new DoubleKey <string, UserKey <string> >(key1, key2);

            Console.WriteLine(string.Join(", ", dd.GetValuesByKey1(key1)));
            Console.WriteLine(string.Join(", ", dd.GetValuesByKey2(key2)));

            //Для метода Add предпочел избежать обработки исключений. TryXXX
            if (!dd.Add(key, 100))
            {
                Console.WriteLine($"Добавление значения с ключом {key.Key1} {key.Key2} не выполнено");
            }

            Console.WriteLine($"{dd.RemoveByKey1(key1)} items with key1 = {key1} was removed!");
            Console.WriteLine($"{dd.RemoveByKey2(key2)} items with key2 = {key2.Key} was removed!");

            if (dd.Add(key, 100))
            {
                Console.WriteLine($"Добавление значения с ключом {key.Key1} {key.Key2} выполнено");
            }

            //индексаторы, исключения для наглядности
            Console.WriteLine($"{key.Key1}, {key.Key2}, {dd[key]}");
            try
            {
                key1 = "Ivan";
                Console.WriteLine($"{key1}, {key2.Key}, {dd[key1, key2]}");
            }
            catch (InvalidOperationException e)
            {
                Console.WriteLine($"{e.Message} [{key1}, {key2.Key}]");
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }

            Console.WriteLine(dd);
            Console.WriteLine("----изменяю значение по имеющемуся индексатору-------");
            dd[key] = 458;
            Console.WriteLine(dd);
            Console.WriteLine("------добавляю значение по отсутсвующему индексатору-------");
            dd["Alex", new UserKey <string>("Laptev")] = 4520;
            Console.WriteLine(dd);
        }
Esempio n. 3
0
 public bool Add(DoubleKey <TKey1, TKey2> key, TValue value)
 {
     lock (locker)
     {
         if (_dictionary.ContainsKey(key))
         {
             return(false);
         }
         _dictionary.Add(key, value);
         return(true);
     }
 }
Esempio n. 4
0
        public static void DictionaryTest2(DoubleKeyDictionary <UserKey <Guid>, UserKey <Guid>, int> dd,
                                           int s1    = 10000,
                                           int s2    = 10,
                                           int sshow = 245)
        {
            //Применяю универсальный пользовательский тип для обоих ключей, объекты которого сравниваются по значению

            Stopwatch sw  = new Stopwatch();
            Random    r   = new Random();
            int       err = 0;

            var testKey = new UserKey <Guid>(Guid.Empty);

            sw.Start();
            for (int i = s1; --i >= 0;)
            {
                var key1 = new UserKey <Guid>(Guid.NewGuid());
                //нужен для вывода части словаря (значение i произвольное)
                if (i == sshow)
                {
                    testKey = key1;
                }

                //иногда цикл удобнее оформить на уменьшение..
                for (int j = s2; --j >= 0;)
                {
                    var key = new DoubleKey <UserKey <Guid>, UserKey <Guid> >(
                        key1,
                        new UserKey <Guid>(Guid.NewGuid()));
                    if (!dd.Add(key, r.Next(0, int.MaxValue)))
                    {
                        err++;
                    }
                }
            }
            sw.Stop();

            Console.WriteLine($"{Thread.CurrentThread.Name} - Выборка из набора ({s2} записей):");
            //для демонстрации работы с LINQ
            dd.GetItemsByKey1(testKey).Select(x =>
            {
                Console.WriteLine($"{Thread.CurrentThread.Name} - {x.Key.Key1}, {x.Key.Key2}, {x.Value}");
                return(x);
            }).ToList();

            Console.WriteLine($"\r\n{Thread.CurrentThread.Name} - DoubleDictionary by length = {dd.Count}, errors = {err}, at {sw.Elapsed} was created.");
        }
Esempio n. 5
0
 public TValue this[DoubleKey <TKey1, TKey2> key]
 {
     get
     {
         lock (locker)
         {
             return(_dictionary[key]);
         }
     }
     set
     {
         lock (locker)
         {
             if (_dictionary.ContainsKey(key))
             {
                 _dictionary[key] = value;
             }
             else
             {
                 _dictionary.Add(key, value);
             }
         }
     }
 }