📄 listbase.cs
字号:
//******************************
// Written by Peter Golde
// Copyright (c) 2004-2005, Wintellect
//
// Use and restribution of this code is subject to the license agreement
// contained in the file "License.txt" accompanying this file.
//******************************
using System;
using System.Collections;
using System.Collections.Generic;
namespace Wintellect.PowerCollections
{
/// <summary>
/// ListBase is an abstract class that can be used as a base class for a read-write collection that needs
/// to implement the generic IList<T> and non-generic IList collections. The derived class needs
/// to override the following methods: Count, Clear, Insert, RemoveAt, and the indexer. The implementation
/// of all the other methods in IList<T> and IList are handled by ListBase.
/// </summary>
/// <typeparam name="T"></typeparam>
[Serializable]
public abstract class ListBase<T> : CollectionBase<T>, IList<T>, IList
{
/// <summary>
/// Creates a new ListBase.
/// </summary>
protected ListBase()
{
}
/// <summary>
/// The property must be overridden by the derived class to return the number of
/// items in the list.
/// </summary>
/// <value>The number of items in the list.</value>
public abstract override int Count { get;}
/// <summary>
/// This method must be overridden by the derived class to empty the list
/// of all items.
/// </summary>
public abstract override void Clear();
/// <summary>
/// The indexer must be overridden by the derived class to get and set
/// values of the list at a particular index.
/// </summary>
/// <param name="index">The index in the list to get or set an item at. The
/// first item in the list has index 0, and the last has index Count-1.</param>
/// <returns>The item at the given index.</returns>
/// <exception cref="ArgumentOutOfRangeException"><paramref name="index"/> is
/// less than zero or greater than or equal to Count.</exception>
public abstract T this[int index]
{
get;
set;
}
/// <summary>
/// This method must be overridden by the derived class to insert a new
/// item at the given index.
/// </summary>
/// <param name="index">The index in the list to insert the item at. After the
/// insertion, the inserted item is located at this index. The
/// first item in the list has index 0.</param>
/// <param name="item">The item to insert at the given index.</param>
/// <exception cref="ArgumentOutOfRangeException"><paramref name="index"/> is
/// less than zero or greater than Count.</exception>
public abstract void Insert(int index, T item);
/// <summary>
/// This method must be overridden by the derived class to remove the
/// item at the given index.
/// </summary>
/// <param name="index">The index in the list to remove the item at. The
/// first item in the list has index 0.</param>
/// <exception cref="ArgumentOutOfRangeException"><paramref name="index"/> is
/// less than zero or greater than or equal to Count.</exception>
public abstract void RemoveAt(int index);
/// <summary>
/// Enumerates all of the items in the list, in order. The item at index 0
/// is enumerated first, then the item at index 1, and so on.
/// </summary>
/// <remarks>The enumerator does not check for changes made
/// to the structure of the list. Thus, changes to the list during
/// enumeration may cause incorrect enumeration or out of range
/// exceptions. Consider overriding this method and adding checks
/// for structural changes.</remarks>
/// <returns>An IEnumerator<T> that enumerates all the
/// items in the list.</returns>
public override IEnumerator<T> GetEnumerator()
{
int count = Count;
for (int i = 0; i < count; ++i) {
yield return this[i];
}
}
/// <summary>
/// Determines if the list contains any item that compares equal to <paramref name="item"/>.
/// The implementation simply checks whether IndexOf(item) returns a non-negative value.
/// </summary>
/// <remarks>Equality in the list is determined by the default sense of
/// equality for T. If T implements IComparable<T>, the
/// Equals method of that interface is used to determine equality. Otherwise,
/// Object.Equals is used to determine equality.</remarks>
/// <param name="item">The item to search for.</param>
/// <returns>True if the list contains an item that compares equal to <paramref name="item"/>.</returns>
public override bool Contains(T item)
{
return (IndexOf(item) >= 0);
}
/// <summary>
/// Adds an item to the end of the list. This method is equivalent to calling:
/// <code>Insert(Count, item)</code>
/// </summary>
/// <param name="item">The item to add to the list.</param>
public override void Add(T item)
{
Insert(Count, item);
}
/// <summary>
/// Searches the list for the first item that compares equal to <paramref name="item"/>.
/// If one is found, it is removed. Otherwise, the list is unchanged.
/// </summary>
/// <remarks>Equality in the list is determined by the default sense of
/// equality for T. If T implements IComparable<T>, the
/// Equals method of that interface is used to determine equality. Otherwise,
/// Object.Equals is used to determine equality.</remarks>
/// <param name="item">The item to remove from the list.</param>
/// <returns>True if an item was found and removed that compared equal to
/// <paramref name="item"/>. False if no such item was in the list.</returns>
public override bool Remove(T item)
{
int index = IndexOf(item);
if (index >= 0) {
RemoveAt(index);
return true;
}
else {
return false;
}
}
/// <summary>
/// Copies all the items in the list, in order, to <paramref name="array"/>,
/// starting at index 0.
/// </summary>
/// <param name="array">The array to copy to. This array must have a size
/// that is greater than or equal to Count.</param>
public virtual void CopyTo(T[] array)
{
this.CopyTo(array, 0);
}
/// <summary>
/// Copies all the items in the list, in order, to <paramref name="array"/>,
/// starting at <paramref name="arrayIndex"/>.
/// </summary>
/// <param name="array">The array to copy to. This array must have a size
/// that is greater than or equal to Count + arrayIndex.</param>
/// <param name="arrayIndex">The starting index in <paramref name="array"/>
/// to copy to.</param>
public override void CopyTo(T[] array, int arrayIndex)
{
base.CopyTo(array, arrayIndex);
}
/// <summary>
/// Copies a range of elements from the list to <paramref name="array"/>,
/// starting at <paramref name="arrayIndex"/>.
/// </summary>
/// <param name="index">The starting index in the source list of the range to copy.</param>
/// <param name="array">The array to copy to. This array must have a size
/// that is greater than or equal to Count + arrayIndex.</param>
/// <param name="arrayIndex">The starting index in <paramref name="array"/>
/// to copy to.</param>
/// <param name="count">The number of items to copy.</param>
public virtual void CopyTo(int index, T[] array, int arrayIndex, int count)
{
Range(index, count).CopyTo(array, arrayIndex);
}
/// <summary>
/// Provides a read-only view of this list. The returned IList<T> provides
/// a view of the list that prevents modifications to the list. Use the method to provide
/// access to the list without allowing changes. Since the returned object is just a view,
/// changes to the list will be reflected in the view.
/// </summary>
/// <returns>An IList<T> that provides read-only access to the list.</returns>
public virtual new IList<T> AsReadOnly()
{
return Algorithms.ReadOnly<T>(this);
}
/// <summary>
/// Finds the first item in the list that satisfies the condition
/// defined by <paramref name="predicate"/>. If no item matches the condition, than
/// the default value for T (null or all-zero) is returned.
/// </summary>
/// <remarks>If the default value for T (null or all-zero) matches the condition defined by <paramref name="predicate"/>,
/// and the list might contain the default value, then it is impossible to distinguish the different between finding
/// the default value and not finding any item. To distinguish these cases, use <see cref="TryFind"/>.</remarks>
/// <param name="predicate">A delegate that defined the condition to check for.</param>
/// <returns>The first item that satisfies the condition <paramref name="predicate"/>. If no item satisfies that
/// condition, the default value for T is returned.</returns>
/// <seealso cref="TryFind"/>
public virtual T Find(Predicate<T> predicate)
{
return Algorithms.FindFirstWhere(this, predicate);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -