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); } } }
public bool Exists(CfgNodeValue <TK, TV> keyVal) { lock (_lock) { return(SingleItems.ContainsKey(keyVal.Key) || RepeatedItems.ContainsKey(keyVal.Key) && RepeatedItems[keyVal.Key].Contains(keyVal)); } }
/// <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); } } }); }
/// <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); } } } } } }
/// <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); } } } }
/// <summary> /// Adds the specified name-value /// </summary> public void CreateValue(CfgNodeValue <string, string> value) { Values.Add(value); }