C \ # ArrayList 소스 분석
투입 도 있 고 산출 도 있다.
배열 은 C \ # 에서 가장 기본 적 인 데이터 형식 으로 초기 화 되면 용량 이 확 정 됩 니 다.동적 으로 용량 을 늘 리 려 면 집합 은 이 수 요 를 만족 시 킬 수 있다.Array List 는 C \ # 에서 가장 많이 사용 되 고 가장 기본 적 인 동적 배열 입 니 다.
Array List 는 System. collections 에서 IList 인터페이스 (IList: 색인 에 따라 접근 할 수 있 는 비 일반적인 집합 대상 을 표시 합 니 다) 를 실현 합 니 다.
그렇다면 Array List 는 어떤 일 을 할 수 있 을 까?1. 동적 확장 가능;2. 삽입 / 삭제 가 비교적 편리 하 다.
쓸데없는 말 이 많아 서 배가 뒤 집 히 는 것 을 방지 하기 위해 코드 를 올 립 니 다.
private Object[] _item[];
private int _size;//ArrayList
private const int _defaultCapacity = 4;//
private static readonly Object[] emptyArray = EmptyArray<Object>.Value; //
- 요소 추가: Add (Object), AddRange (ICollection), Insert (Int 32, Object), InsertRange (Int 32, ICollection).
public virtual int Add(Object value) {
Contract.Ensures(Contract.Result<int>() >= 0);// , 0
// , ArrayList ,
if (_size == _items.Length) EnsureCapacity(_size + 1);
_items[_size] = value;// ArrayList
_version++;
return _size++;// ArrayList
}
// , 2 , long
private void EnsureCapacity(int min) {
if (_items.Length < min) {
int newCapacity = _items.Length == 0
? _defaultCapacity: _items.Length * 2;
//Array.MaxArrayLength long
if ((uint)newCapacity > Array.MaxArrayLength)
newCapacity = Array.MaxArrayLength;
if (newCapacity < min) newCapacity = min;
Capacity = newCapacity;
}
}
// ,
public virtual int Capacity {
get {
Contract.Ensures(Contract.Result<int>() >= Count);
return _items.Length;
}
set {
if (value < _size) {
throw new ArgumentOutOfRangeException("value",
Environment.GetResourceString("ArgumentOutOfRange_SmallCapacity"));
}
Contract.Ensures(Capacity >= 0);
Contract.EndContractBlock();
if (value != _items.Length) {
if (value > 0) {
Object[] newItems = new Object[value];
if (_size > 0) {
Array.Copy(_items, 0, newItems, 0, _size);
}
_items = newItems;
}
else {
_items = new Object[_defaultCapacity];
}
}
}
}
2. AddRange(ICollection): ICollection ArrayList 。 InsertRange(Int32, ICollection)
public virtual void AddRange(ICollection c) {
InsertRange(_size, c);
}
3. Insert(Int32, Object) : ArrayList 。
public virtual void Insert(int index, Object value) {
if(index < 0 || index > _size)
throw new ArgumentOutOfRangeException("index", Environment.GetResourceString("ArgumentOutOfRange_ArrayListInsert"));
Contract.EndContractBlock();
//
if(_size == _items.Length) EnsureCapacity(_size + 1);
// , , , Add ,
if(index < _size){
Array.Copy(_items, index, _items, index + 1, _size - index);
}
_items[index] = value;
_size++;
_version++;
}
4. InsertRange(Int32, ICollection): ICollection ArrayList 。
public virtual void InsertRange(int index, ICollection c) {
if (c==null)
throw new ArgumentNullException("c", Environment.GetResourceString("ArgumentNull_Collection"));
if (index < 0 || index > _size)
throw new ArgumentOutOfRangeException("index", Environment.GetResourceString("ArgumentOutOfRange_Index"));
Contract.EndContractBlock();//
int count = c.Count;// ArrayList
if (count > 0) {
// ,
EnsureCapacity(_size + count);
// ,
if (index < _size) {
//
Array.Copy(_items, index, _items, index + count, _size - index);
}
// for , ?
// ArrayList
Object[] itemsToInsert = new Object[count];
c.CopyTo(itemsToInsert, 0);
//
itemsToInsert.CopyTo(_items, index);
_size += count;
_version++;
}
}
- 제거 요소: Remove (Object), RemoveAt (Int 32), RemoveRange (Int 32, Int 32), Clear ().
public virtual void Remove(Object obj) {
Contract.Ensures(Count >= 0);
// IndexOf(Int32)
int index = IndexOf(obj);
if(index >= 0)
RemoveAt(index);
}
2. RemoveAt (Int 32): Array List 의 지정 한 색인 에 있 는 요 소 를 제거 합 니 다.
public virtual void RemoveAt(int index) {
if (index < 0 || index >= _size)
throw new ArgumentOutOfRangeException("index",
Environment.GetResourceString("ArgumentOutOfRange_Index"));
Contract.Ensures(Count >= 0);
Contract.EndContractBlock();
_size--;// , 1
// ,
if (index < _size) {
Array.Copy(_items, index + 1, _items, index, _size - index);
}
_items[_size] = null;
_version++;
}
3. RemoveRange (Int 32, Int 32): Array List 에서 일정한 범위 의 요 소 를 제거 합 니 다.
public virtual void Clear() {
if (_size > 0)
{
//
Array.Clear(_items, 0, _size);
_size = 0;
}
_version++;
}
- 정렬: Sort (), Sort (IComparer), Sort (Int 32, Int 32, IComparer), Reverse (), Reverse (Int 32, Int 32)
public virtual void Sort(int index, int count, IComparer comparer) {
if (index < 0)
throw new ArgumentOutOfRangeException("index",
Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
if (count < 0)
throw new ArgumentOutOfRangeException("count",
Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
if (_size - index < count)
throw new ArgumentException(Environment.GetResourceString("Argument_InvalidOffLen"));
Contract.EndContractBlock();
//
Array.Sort(_items, index, count, comparer);
_version++;
}
4. Reverse (): 전체 Array List 에서 요소 의 순 서 를 반전 시 킵 니 다.
public virtual void Reverse(int index, int count) {
if (index < 0)
throw new ArgumentOutOfRangeException("index",
Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
if (count < 0)
throw new ArgumentOutOfRangeException("count",
Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
if (_size - index < count)
throw new ArgumentException(Environment.GetResourceString("Argument_InvalidOffLen"));
Contract.EndContractBlock();
Array.Reverse(_items, index, count);
_version++;
}
5. Reverse (Int 32, Int 32): 지정 한 범위 의 요소 의 순 서 를 반전 합 니 다.
public virtual void Reverse(int index, int count) {
if (index < 0)
throw new ArgumentOutOfRangeException("index",
Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
if (count < 0)
throw new ArgumentOutOfRangeException("count",
Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
if (_size - index < count)
throw new ArgumentException(Environment.GetResourceString("Argument_InvalidOffLen"));
Contract.EndContractBlock();
Array.Reverse(_items, index, count);
_version++;
}
ArrayList 는 C \ # 에서 가장 간단 한 데이터 구조 라 고 할 수 있 습 니 다. ArrayList 를 사용 할 때 일부 성능 향상 을 얻 기 위해 예측 가능 한 용량 크기 범위 내 에서 고정된 초기 용량 을 사용 하여 ArrayList 를 구축 하여 특정한 상황 에서 내부 배열 의 중복 생 성과 데이터 위치의 변 화 를 피 할 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.