C#自定义集合
集合
public class Myset < T>
{
private const int defualtSize = 4 ;
private T[ ] items;
private int _size;
private T[ ] emptyArray = new T [ 0 ] ;
public int Count
{
get
{
return _size;
}
}
public T this [ int index]
{
get
{
if ( items == null )
{
return default ( T) ;
}
if ( index < 0 || index >= items. Length)
{
throw new Exception ( "数组下标异常!" ) ;
}
return items[ index] ;
}
set
{
if ( items == null )
{
return ;
}
if ( index < 0 || index >= items. Length)
{
throw new Exception ( "数组下标异常!" ) ;
}
items[ index] = value ;
}
}
public Myset ( )
{
items = emptyArray;
}
public Myset ( int size)
{
items = new T [ size] ;
}
public void Add ( T item)
{
if ( item == null )
{
throw new Exception ( "添加的元素不能为空!" ) ;
}
if ( _size == items. Length)
{
int num = ( items. Length == 0 ) ? defualtSize : items. Length * 2 ;
SetCapacity ( num) ;
}
items[ _size] = item;
_size++ ;
}
public bool Remove ( T item)
{
if ( item == null )
{
throw new Exception ( "移除的元素不能为空!" ) ;
}
int index = IndexOf ( item) ;
if ( index >= 0 )
{
Array. Copy ( items, index + 1 , items, index, _size - index - 1 ) ;
items[ _size - 1 ] = default ( T) ;
_size-- ;
return true ;
}
return false ;
}
public void Clear ( )
{
if ( _size > 0 )
{
Array. Clear ( items, 0 , _size) ;
_size = 0 ;
}
}
public void SetCapacity ( int length)
{
if ( length <= _size)
{
throw new Exception ( "扩容的长度不能比当前的长度小!" ) ;
}
T[ ] array = new T [ length] ;
if ( _size > 0 )
{
Array. Copy ( items, array, _size) ;
}
items = array;
}
public int IndexOf ( T item)
{
for ( int i = 0 ; i < _size; i++ )
{
if ( items[ i] . Equals ( item) ) { return i; }
}
return - 1 ;
}
}
测试
class TestMyset
{
static void Main ( string [ ] args)
{
Myset< int > myset = new Myset < int > ( ) ;
myset. Add ( 1 ) ;
myset. Add ( 2 ) ;
myset. Add ( 3 ) ;
myset. Add ( 4 ) ;
myset. Remove ( 4 ) ;
for ( int i = 0 ; i < myset. Count; i++ )
{
Console. WriteLine ( " i : {0} v : {1} " , i, myset[ 1 ] ) ;
}
myset. Clear ( ) ;
for ( int i = 0 ; i < myset. Count; i++ )
{
Console. WriteLine ( " i : {0} v : {1} " , i, myset[ 1 ] ) ;
}
Console. ReadLine ( ) ;
}
}