コード例 #1
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);
         }
     }
 }
コード例 #2
0
 public bool Exists(CfgNodeValue <TK, TV> keyVal)
 {
     lock (_lock)
     {
         return(SingleItems.ContainsKey(keyVal.Key) || RepeatedItems.ContainsKey(keyVal.Key) && RepeatedItems[keyVal.Key].Contains(keyVal));
     }
 }
コード例 #3
0
        /// <summary>
        /// We received a experimental part message so update the scenario file accordingly
        /// </summary>
        public static void WriteExperimentalPartDataToFile(ShareProgressExperimentalPartMsgData experimentalPartMsg)
        {
            Task.Run(() =>
            {
                lock (Semaphore.GetOrAdd("ResearchAndDevelopment", new object()))
                {
                    if (!ScenarioStoreSystem.CurrentScenarios.TryGetValue("ResearchAndDevelopment", out var scenario))
                    {
                        return;
                    }

                    var expPartNode = scenario.GetNode("ExpParts");
                    if (expPartNode == null && experimentalPartMsg.Count > 0)
                    {
                        scenario.AddNode(new ConfigNode("ExpParts", scenario));
                        expPartNode = scenario.GetNode("ExpParts");
                    }

                    var specificExpPart = expPartNode?.Value.GetValue(experimentalPartMsg.PartName);
                    if (specificExpPart == null)
                    {
                        var newVal = new CfgNodeValue <string, string>(experimentalPartMsg.PartName,
                                                                       experimentalPartMsg.Count.ToString(CultureInfo.InvariantCulture));

                        expPartNode?.Value.CreateValue(newVal);
                    }
                    else
                    {
                        if (experimentalPartMsg.Count == 0)
                        {
                            expPartNode.Value.RemoveValue(specificExpPart.Value);
                        }
                        else
                        {
                            specificExpPart.Value = experimentalPartMsg.Count.ToString(CultureInfo.InvariantCulture);
                        }
                    }

                    if (expPartNode?.Value.GetAllValues().Count == 0)
                    {
                        scenario.RemoveNode(expPartNode.Value);
                    }
                }
            });
        }
コード例 #4
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);
                            }
                        }
                    }
                }
            }
        }
コード例 #5
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);
             }
         }
     }
 }
コード例 #6
0
 /// <summary>
 /// Adds the specified name-value
 /// </summary>
 public void CreateValue(CfgNodeValue <string, string> value)
 {
     Values.Add(value);
 }