Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class Set<T> : IEnumerable<T>, IEnumerable
- where T: IComparable
- {
- public int Length => Buffer.Count();
- private List<T> Buffer { get; set; }
- private int Pointer { get; set; }
- public Set()
- {
- Buffer = new List<T>();
- Pointer = 0;
- }
- public Set(int size)
- {
- Buffer = new List<T>(size);
- Pointer = 0;
- }
- public Set(IEnumerable<T> initializer)
- {
- Buffer = initializer.OrderBy(x => x).Distinct().ToList();
- Pointer = 0;
- }
- public Set(params T[] initializer)
- {
- Buffer = initializer.OrderBy(x => x).Distinct().ToList();
- Pointer = 0;
- }
- public bool Add(T item)
- {
- if (!Buffer.Contains(item))
- {
- Pointer = GetLeftBorder(item);
- Buffer.Insert(Pointer + 1, item);
- return true;
- }
- return false;
- }
- public T FindNext(T item)
- {
- var itemIndex = Search(item);
- if (itemIndex != -1)
- return Buffer[itemIndex + 1];
- return default(T);
- }
- private int GetLeftBorder(T item)
- {
- var (left, right) = (-1, Buffer.Count());
- return GetLeftBorder(item, left, right);
- }
- private int GetLeftBorder(T item, int left, int right)
- {
- while (!(right <= left + 1))
- {
- var mid = (right - left) / 2 + left;
- if (item.CompareTo(Buffer[mid]) < 0)
- {
- right = mid;
- continue;
- }
- left = mid;
- }
- return left;
- }
- private int Search(T item)
- {
- var (left, right) = (0, Buffer.Count()-1);
- while (left < right)
- {
- var mid = (right - left) / 2 + left;
- if (item.CompareTo(Buffer[mid]) <= 0)
- {
- right = mid;
- continue;
- }
- left = mid + 1;
- }
- if (Buffer[right].Equals(item))
- return right;
- return -1;
- }
- IEnumerator IEnumerable.GetEnumerator()
- {
- return this.GetEnumerator();
- }
- public IEnumerator<T> GetEnumerator()
- {
- foreach (var item in Buffer)
- {
- yield return (T)item;
- }
- }
- public T this[int index]
- {
- get
- {
- if (index >= 0 && index < Buffer.Count)
- return Buffer[index];
- throw new IndexOutOfRangeException($"Недопустимое значение индекса {index}: Вне диапазона");
- }
- }
- public bool EnumerableCompareTo(Set<T> other)
- {
- if (Buffer.Count != other.Length)
- return false;
- var length = other.Length;
- for (int i = 0; i < length; i++)
- {
- if (!this[i].Equals(other[i]))
- return false;
- }
- return true;
- }
- public bool EqualsTo(Set<T> other)
- {
- return EnumerableCompareTo(other);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement