using Sarand.Net.Standard.Base.App; using Sarand.Net.Standard.Base.Utils; using System; using System.Collections.Generic; using System.Collections.ObjectModel; namespace Sarand.Net.Standard.Base.Core { //======================================================================= public class NamedValue { //------------------------------------------------------------------- // Data members. //------------------------------------------------------------------- // Construction. private NamedValue (String name, DataValue value) { Name = StringUtil.EmptyOnNull(name); Value = value ?? new DataValue(); } //------------------------------------------------------------------- // Properties. public String Name { get; private set; } public DataValue Value { get; private set; } //------------------------------------------------------------------- /// Associative array of named values, case insensitive. public class Map { //--------------------------------------------------------------- // Data members. private readonly Dictionary values = new Dictionary(StringComparer.OrdinalIgnoreCase); //--------------------------------------------------------------- // Construction. public Map (Dictionary values = null) { if (values != null) this.values.AddRange(values); } public Map (NamedValue.Map values) { if (values != null) this.values.AddRange(values.values); } //--------------------------------------------------------------- // Properties. /// Optional identifier for the set of values. public String Id { get; set; } = String.Empty; /// Retrieve a copy of the value list. public Dictionary Values { get { return new Dictionary(values); } } /// Number of values in collection. public int Count { get { return values.Count; } } //--------------------------------------------------------------- // Update list. public void Clear () { values.Clear(); } public bool AddValue (String name, DataValue value) { if (String.IsNullOrEmpty(name) || value == null) { if (SacsSystem.DebugMode) SaLogger.Debug(GetType().Name + ".AddValue Invalid named value. Name: " + StringUtil.EmptyOnNull(name) + ". Value: " + (value != null ? value.GetDataType().ToString() : "null")); return false; } values[name] = value; return true; } public bool AddValues (NamedValue.Map values) { return AddValues(values.ToNamedValueList()); } public bool AddValues (ICollection values) { bool addValues = true; foreach (NamedValue value in values) { if (!AddValue(value.Name, value.Value)) addValues = false; } return addValues; } /// Remove the named value from the list if present. public bool RemoveValue (String name) { if (!HasValue(name)) return false; return values.Remove(name); } /// Change the name of a value in the list. public bool RenameValue (String nameOld, String nameNew) { if (StringUtil.IsEmpty(nameOld) || !HasValue(nameOld) || StringUtil.IsEmpty(nameNew) || nameOld.EqualsCI(nameNew)) return false; DataValue value = GetValue(nameOld); RemoveValue(nameOld); return AddValue(nameNew, value); } //--------------------------------------------------------------- /// Does the list include a value with the specified name. public bool HasValue (String name) { return values.HasValue(name); } //--------------------------------------------------------------- /// Retrieve the value with the specified name. public DataValue GetValue (String name) { return values.GetValue(name); } /// Retrieve the named value as a String. public String GetString (String name, String defaultValue = "") { return values.GetString(name, defaultValue); } /// Retrieve the named value as a boolean. public bool GetBool (String name, bool defaultValue = false) { return values.GetBool(name, defaultValue); } /// Retrieve the named value as a long integer. public long GetLong (String name, long defaultValue = 0) { return values.GetLong(name, defaultValue); } /// Retrieve the named value as a double. public double GetDouble (String name, double defaultValue = 0) { return values.GetDouble(name, defaultValue); } /// Retrieve the named value as a decimal. public decimal GetDecimal (String name, decimal defaultValue = 0) { return values.GetDecimal(name, defaultValue); } /// Retrieve the named value as a DateTime. public DateTime GetDateTime (String name) { return values.GetDateTime(name); } /// Retrieve the named value as a date. public DateTime GetDate (String name) { return values.GetDate(name); } /// Retrieve the named value as a time. public DateTime GetTime (String name) { return values.GetTime(name); } //--------------------------------------------------------------- // Conversion. //--------------------------------------------------------------- public List ToNamedValueList () { List values = new List(); foreach (String name in this.values.Keys) values.Add(new NamedValue(name, this.values.GetValue(name))); return values; } /// Concatenate the values with the specified delimiters. public String Concat (String entryDelim = ".", String valueDelim = "=") { return values.Concat(entryDelim, valueDelim); } //--------------------------------------------------------------- } //------------------------------------------------------------------- } //======================================================================= public static class NamedValueDictionary { //------------------------------------------------------------------- /// Does the list include a value with the specified name, case insensitive. public static bool HasValue (this Dictionary values, String name) { if (String.IsNullOrEmpty(name)) return false; return values.ContainsKey(name); } //------------------------------------------------------------------- /// Retrieve the value with the specified name. public static DataValue GetValue (this Dictionary values, String name) { if (StringUtil.IsEmpty(name)) return DataValue.NullValue; if (values.ContainsKey(name)) return values[name]; return DataValue.NullValue; } /// Retrieve the named value as a String. public static String GetString (this Dictionary values, String name, String defaultValue = "") { if (values.HasValue(name)) return values.GetValue(name).ToString(); return defaultValue; } /// Retrieve the named value as a boolean. public static bool GetBool (this Dictionary values, String name, bool defaultValue = false) { if (values.HasValue(name)) return values.GetValue(name).AsBool(); return defaultValue; } /// Retrieve the named value as a long integer. public static long GetLong (this Dictionary values, String name, long defaultValue = 0) { if (values.HasValue(name)) return values.GetValue(name).AsLong(); return defaultValue; } /// Retrieve the named value as a double. public static double GetDouble (this Dictionary values, String name, double defaultValue = 0) { if (values.HasValue(name)) return values.GetValue(name).AsDouble(); return defaultValue; } /// Retrieve the named value as a decimal. public static decimal GetDecimal (this Dictionary values, String name, decimal defaultValue = 0) { if (values.HasValue(name)) return values.GetValue(name).AsDecimal(); return defaultValue; } /// Retrieve the named value as a DateTime. public static DateTime GetDateTime (this Dictionary values, String name) { if (values.HasValue(name)) return values.GetValue(name).AsDateTime(); return DateTime.MinValue; } /// Retrieve the named value as a date. public static DateTime GetDate (this Dictionary values, String name) { if (values.HasValue(name)) return values.GetValue(name).AsDate(); return DateTime.MinValue; } /// Retrieve the named value as a time. public static DateTime GetTime (this Dictionary values, String name) { if (values.HasValue(name)) return values.GetValue(name).AsTime(); return DateTime.MinValue; } //------------------------------------------------------------------- // Conversion. /// Concatenate the values with the specified delimiters. public static String Concat (this Dictionary values, String entryDelim = ".", String valueDelim = "=") { List dataValues = new List(); foreach (String name in values.Keys) dataValues.Add(name + valueDelim + values[name]); return dataValues.Concat(entryDelim); } //------------------------------------------------------------------- } //======================================================================= }