Mercurial > pub > bltoolkit
diff Source/EditableObjects/EditableList.cs @ 0:f990fcb411a9
Копия текущей версии из github
author | cin |
---|---|
date | Thu, 27 Mar 2014 21:46:09 +0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Source/EditableObjects/EditableList.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,369 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; + +namespace BLToolkit.EditableObjects +{ + [Serializable] + [DebuggerDisplay("Count = {Count}")] + public class EditableList<T> : EditableArrayList, IList<T> + { + #region Constructors + + public EditableList() + : base(typeof(T)) + { + } + + public EditableList(int capacity) + : base(typeof(T), capacity) + { + } + + public EditableList(ICollection c) + : base(typeof(T), c) + { + } + + public EditableList(bool trackChanges) + : base(typeof(T), trackChanges) + { + } + + public EditableList(int capacity, bool trackChanges) + : base(typeof(T), capacity, trackChanges) + { + } + + public EditableList(ICollection c, bool trackChanges) + : base(typeof(T), c, trackChanges) + { + } + + public EditableList(EditableList<T> list) + : base(list, true) + { + } + + public EditableList(EditableList<T> list, bool trackChanges) + : base(list, trackChanges) + { + } + + #endregion + + #region Typed Methods + + public override object Clone() + { + return Clone(new EditableList<T>((ArrayList)List.Clone())); + } + + public new T this[int index] + { + get { return (T)base[index]; } + set { base[index] = value; } + } + + public new T[] ToArray() + { + return (T[])base.ToArray(typeof(T)); + } + + public new T AddNew() + { + return (T)base.AddNew(); + } + + public int RemoveAll(Predicate<T> match) + { + var n = 0; + + for (var i = 0; i < Count; i++) + { + var item = this[i]; + + if (match(item)) + { + Remove((object)item); + i--; + n++; + } + } + + return n; + } + + #endregion + + #region Like List<T> Methods + + public T Find(Predicate<T> match) + { + if (match == null) throw new ArgumentNullException("match"); + + foreach (T t in List) + if (match(t)) + return t; + + return default(T); + } + + public EditableList<T> FindAll(Predicate<T> match) + { + if (match == null) throw new ArgumentNullException("match"); + + var list = new EditableList<T>(); + + foreach (T t in List) + if (match(t)) + list.Add(t); + + return list; + } + + public int FindIndex(Predicate<T> match) + { + return FindIndex(0, List.Count, match); + } + + public int FindIndex(int startIndex, Predicate<T> match) + { + return FindIndex(startIndex, List.Count - startIndex, match); + } + + public int FindIndex(int startIndex, int count, Predicate<T> match) + { + if (startIndex > List.Count) + throw new ArgumentOutOfRangeException("startIndex"); + + if (count < 0 || startIndex > List.Count - count) + throw new ArgumentOutOfRangeException("count"); + + if (match == null) + throw new ArgumentNullException("match"); + + for (var i = startIndex; i < startIndex + count; i++) + if (match((T)List[i])) + return i; + + return -1; + } + + public T FindLast(Predicate<T> match) + { + if (match == null) throw new ArgumentNullException("match"); + + for (var i = List.Count - 1; i >= 0; i--) + { + var t = (T)List[i]; + + if (match(t)) + return t; + } + + return default(T); + } + + public int FindLastIndex(Predicate<T> match) + { + return FindLastIndex(List.Count - 1, List.Count, match); + } + + public int FindLastIndex(int startIndex, Predicate<T> match) + { + return FindLastIndex(startIndex, startIndex + 1, match); + } + + public int FindLastIndex(int startIndex, int count, Predicate<T> match) + { + if (startIndex >= List.Count) + throw new ArgumentOutOfRangeException("startIndex"); + + if (count < 0 || startIndex - count + 1 < 0) + throw new ArgumentOutOfRangeException("count"); + + if (match == null) + throw new ArgumentNullException("match"); + + for (var i = startIndex; i > startIndex - count; i--) + { + var t = (T)List[i]; + + if (match(t)) + return i; + } + + return -1; + } + + public void ForEach(Action<T> action) + { + if (action == null) throw new ArgumentNullException("action"); + + foreach (T t in List) + action(t); + } + + public void Sort(IComparer<T> comparer) + { + Sort(0, List.Count, comparer); + } + + public void Sort(int index, int count, IComparer<T> comparer) + { + if (List.Count > 1 && count > 1) + { + var items = new T[count]; + + List.CopyTo(index, items, 0, count); + Array.Sort(items, index, count, comparer); + + for (var i = 0; i < count; i++) + List[i + index] = items[i]; + + OnListChanged(ListChangedType.Reset, 0); + } + } + + public void Sort(Comparison<T> comparison) + { + if (List.Count > 1) + { + var items = new T[List.Count]; + + List.CopyTo(items); + Array.Sort(items, comparison); + + for (var i = 0; i < List.Count; i++) + List[i] = items[i]; + + OnListChanged(ListChangedType.Reset, 0); + } + } + + #endregion + + #region Static Methods + + internal EditableList(ArrayList list) + : base(typeof(T), list) + { + } + + public static EditableList<T> Adapter(List<T> list) + { + return new EditableList<T>(ArrayList.Adapter(list)); + } + + public static new EditableList<T> Adapter(IList list) + { + return list is ArrayList? + new EditableList<T>((ArrayList)list): + new EditableList<T>(ArrayList.Adapter(list)); + } + + #endregion + + #region IList<T> Members + + public int IndexOf(T item) + { + return IndexOf((object)item); + } + + public void Insert(int index, T item) + { + Insert(index, (object)item); + } + + #endregion + + #region ICollection<T> Members + + public void Add(T item) + { + Add((object)item); + } + + public bool Contains(T item) + { + return Contains((object)item); + } + + public void CopyTo(T[] array, int arrayIndex) + { + CopyTo((Array)array, arrayIndex); + } + + public bool Remove(T item) + { + if (Contains(item) == false) + return false; + + Remove((object)item); + + return true; + } + + #endregion + + #region IEnumerable<T> Members + + public new IEnumerator<T> GetEnumerator() + { + return new Enumerator(List.GetEnumerator()); + } + + class Enumerator : IEnumerator<T> + { + public Enumerator(IEnumerator enumerator) + { + _enumerator = enumerator; + } + + private readonly IEnumerator _enumerator; + + #region IEnumerator<T> Members + + T IEnumerator<T>.Current + { + get { return (T)_enumerator.Current; } + } + + #endregion + + #region IEnumerator Members + + object IEnumerator.Current + { + get { return _enumerator.Current; } + } + + bool IEnumerator.MoveNext() + { + return _enumerator.MoveNext(); + } + + void IEnumerator.Reset() + { + _enumerator.Reset(); + } + + #endregion + + #region IDisposable Members + + void IDisposable.Dispose() + { + } + + #endregion + } + + #endregion + } +} +