protected override ImmutableSortedDictionary <TKey, TValue> AddRange(ImmutableSortedDictionary <TKey, TValue> values, ref ArraySegment <KeyValuePair <TKey, TValue> > newValues, ISerializationContext context)
 {
     if (newValues.Count == 1)
     {
         var pair = newValues.Singleton();
         return(values.Add(pair.Key, pair.Value));
     }
     return(values.AddRange(newValues));
 }
예제 #2
0
        /// <summary>
        /// Appends the tags.
        /// </summary>
        /// <param name="writer">The writer.</param>
        /// <param name="pointSettings">The point settings.</param>
        private void AppendTags(StringBuilder writer, PointSettings pointSettings)
        {
            IReadOnlyDictionary <string, string> entries;

            if (pointSettings == null)
            {
                entries = _tags;
            }
            else
            {
                IReadOnlyDictionary <string, string> defaultTags =
                    pointSettings.GetDefaultTags();
                try
                {
                    entries = _tags.AddRange(defaultTags);
                }
                catch (ArgumentException)
                {
                    // Most cases don't expect to override existing content
                    // override don't consider as best practice
                    // therefore it a trade-off between being less efficient
                    // on the default behavior or on the override scenario
                    var builder = _tags.ToBuilder();
                    foreach (var item in defaultTags)
                    {
                        var name = item.Key;
                        if (!builder.ContainsKey(name)) // existing tags overrides
                        {
                            builder.Add(name, item.Value);
                        }
                    }
                    entries = builder;
                }
            }

            foreach (var keyValue in entries)
            {
                var key   = keyValue.Key;
                var value = keyValue.Value;

                if (string.IsNullOrEmpty(key) || string.IsNullOrEmpty(value))
                {
                    continue;
                }

                writer.Append(',');
                EscapeKey(writer, key);
                writer.Append('=');
                EscapeKey(writer, value);
            }

            writer.Append(' ');
        }