예제 #1
0
 public bool Exists(CfgNodeValue <TK, TV> keyVal)
 {
     lock (_lock)
     {
         return(SingleItems.ContainsKey(keyVal.Key) || RepeatedItems.ContainsKey(keyVal.Key) && RepeatedItems[keyVal.Key].Contains(keyVal));
     }
 }
예제 #2
0
 public void Add(CfgNodeValue <TK, TV> value)
 {
     lock (_lock)
     {
         AllItems.Add(value);
         if (!RepeatedItems.ContainsKey(value.Key))
         {
             if (SingleItems.ContainsKey(value.Key))
             {
                 RepeatedItems.Add(value.Key, new List <CfgNodeValue <TK, TV> > {
                     SingleItems[value.Key]
                 });
                 SingleItems.Remove(value.Key);
                 RepeatedItems[value.Key].Add(value);
             }
             else
             {
                 SingleItems.Add(value.Key, value);
             }
         }
         else
         {
             RepeatedItems[value.Key].Add(value);
         }
     }
 }
예제 #3
0
 public bool Exists(TK key)
 {
     lock (_lock)
     {
         return(SingleItems.ContainsKey(key) || RepeatedItems.ContainsKey(key));
     }
 }
예제 #4
0
 public void Clear()
 {
     lock (_lock)
     {
         AllItems.Clear();
         SingleItems.Clear();
         RepeatedItems.Clear();
     }
 }
예제 #5
0
 public List <CfgNodeValue <TK, TV> > GetSeveral(TK key)
 {
     lock (_lock)
     {
         return(SingleItems.ContainsKey(key) ? new List <CfgNodeValue <TK, TV> > {
             SingleItems[key]
         } :
                RepeatedItems.ContainsKey(key) ? RepeatedItems[key] : new List <CfgNodeValue <TK, TV> >());
     }
 }
예제 #6
0
 public override int GetHashCode()
 {
     unchecked
     {
         var hashCode = (AllItems != null ? AllItems.GetHashCode() : 0);
         hashCode = (hashCode * 397) ^ (SingleItems != null ? SingleItems.GetHashCode() : 0);
         hashCode = (hashCode * 397) ^ (RepeatedItems != null ? RepeatedItems.GetHashCode() : 0);
         return(hashCode);
     }
 }
예제 #7
0
        public CfgNodeValue <TK, TV> GetSingle(TK key)
        {
            lock (_lock)
            {
                if (!RepeatedItems.ContainsKey(key))
                {
                    return(SingleItems.ContainsKey(key) ? SingleItems[key] : null);
                }

                throw new Exception($"Key value: \"{key}\" is not unique");
            }
        }
예제 #8
0
 /// <summary>
 /// Remove all the elements that have the given key
 /// </summary>
 public void Remove(TK key)
 {
     lock (_lock)
     {
         AllItems.RemoveAll(v => v.Key.Equals(key));
         if (SingleItems.ContainsKey(key))
         {
             SingleItems.Remove(key);
         }
         else
         {
             RepeatedItems.Remove(key);
         }
     }
 }
예제 #9
0
 /// <summary>
 /// Sets a new value for a single element that matches in KEY
 /// </summary>
 public void Update(TK key, TV value)
 {
     lock (_lock)
     {
         if (!RepeatedItems.ContainsKey(key))
         {
             if (SingleItems.ContainsKey(key))
             {
                 SingleItems[key].Value = value;
             }
         }
         else if (RepeatedItems.ContainsKey(key))
         {
             throw new Exception($"Key value: \"{key}\" is not unique. Use Replace()");
         }
     }
 }
예제 #10
0
        /// <summary>
        /// Replaces ALL the elements that match in KEY and VALUE for the new one
        /// </summary>
        public void Replace(CfgNodeValue <TK, TV> oldKeyVal, CfgNodeValue <TK, TV> newKeyVal)
        {
            lock (_lock)
            {
                var index = AllItems.IndexOf(oldKeyVal);
                if (index >= 0)
                {
                    AllItems[index] = newKeyVal;

                    if (SingleItems.ContainsKey(oldKeyVal.Key))
                    {
                        if (oldKeyVal.Key.Equals(newKeyVal.Key))
                        {
                            SingleItems[oldKeyVal.Key] = newKeyVal;
                        }
                        else
                        {
                            SingleItems.Remove(oldKeyVal.Key);
                            SingleItems.Add(newKeyVal.Key, newKeyVal);
                        }
                    }
                    else
                    {
                        if (RepeatedItems.ContainsKey(oldKeyVal.Key))
                        {
                            if (oldKeyVal.Key.Equals(newKeyVal.Key))
                            {
                                for (var i = 0; i < RepeatedItems[oldKeyVal.Key].Count; i++)
                                {
                                    if (RepeatedItems[oldKeyVal.Key][i].Equals(oldKeyVal))
                                    {
                                        RepeatedItems[oldKeyVal.Key][i] = newKeyVal;
                                    }
                                }
                            }
                            else
                            {
                                Remove(oldKeyVal);
                                Add(newKeyVal);
                            }
                        }
                    }
                }
            }
        }
예제 #11
0
 /// <summary>
 /// Removes a specific value
 /// </summary>
 public void Remove(CfgNodeValue <TK, TV> keyVal)
 {
     lock (_lock)
     {
         AllItems.RemoveAll(v => v.Value.Equals(keyVal));
         if (SingleItems.ContainsKey(keyVal.Key))
         {
             SingleItems.Remove(keyVal.Key);
         }
         else if (RepeatedItems.ContainsKey(keyVal.Key))
         {
             RepeatedItems[keyVal.Key].RemoveAll(v => v.Equals(keyVal));
             if (!RepeatedItems[keyVal.Key].Any())
             {
                 RepeatedItems.Remove(keyVal.Key);
             }
         }
     }
 }
예제 #12
0
 public IEnumerator <KeyValuePair <K, V> > GetEnumerator()
 {
     return(SingleItems.GetEnumerator());
 }