ChangeTrackingStringList
                    class ChangeTrackingStringList : IList<string>, ICollection<string>, IEnumerable<string>, IEnumerable
                
                using System.Collections;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
namespace System.ClientModel.Internal
{
    [System.Runtime.CompilerServices.NullableContext(1)]
    [System.Runtime.CompilerServices.Nullable(0)]
    internal class ChangeTrackingStringList : IList<string>, ICollection<string>, IEnumerable<string>, IEnumerable
    {
        private IList<string> _list;
        private bool _frozen;
        private bool _tracking = true;
        public bool HasChanged { get; set; }
        public string this[int index] {
            get {
                return _list[index];
            }
            set {
                AssertNotFrozen();
                _list[index] = value;
                HasChanged |= _tracking;
            }
        }
        public int Count => _list.Count;
        public bool IsReadOnly => _list.IsReadOnly;
        public ChangeTrackingStringList()
        {
            _list = new List<string>();
        }
        public ChangeTrackingStringList(IEnumerable<string> collection)
        {
            _list = new List<string>(collection);
        }
        public void Freeze()
        {
            _frozen = true;
        }
        public void AssertNotFrozen()
        {
            if (_frozen)
                throw new InvalidOperationException("Cannot change any client pipeline options after the client pipeline has been created.");
        }
        public void Add(string item)
        {
            AssertNotFrozen();
            _list.Add(item);
            HasChanged |= _tracking;
        }
        public void Clear()
        {
            AssertNotFrozen();
            int count = _list.Count;
            _list.Clear();
            HasChanged |= (_tracking && count != 0);
        }
        public bool Contains(string item)
        {
            return _list.Contains(item);
        }
        public void CopyTo(string[] array, int arrayIndex)
        {
            _list.CopyTo(array, arrayIndex);
        }
        public IEnumerator<string> GetEnumerator()
        {
            return _list.GetEnumerator();
        }
        public int IndexOf(string item)
        {
            return _list.IndexOf(item);
        }
        public void Insert(int index, string item)
        {
            AssertNotFrozen();
            _list.Insert(index, item);
            HasChanged |= _tracking;
        }
        public bool Remove(string item)
        {
            AssertNotFrozen();
            bool flag = _list.Remove(item);
            HasChanged |= (_tracking & flag);
            return flag;
        }
        public void RemoveAt(int index)
        {
            AssertNotFrozen();
            _list.RemoveAt(index);
            HasChanged |= _tracking;
        }
        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
    }
}