(c#) массивы
Я, например, наваял себе шняжку с быстрым удалением. Там типа на места удаленного элемента вставляется последний. Она у меня лежит в специальном файлике, потом я делаю ctrl+c, ctrl+tab, ctrl+v, коллапсю и выделяю регион, сеарчРеплейс SomeObjectTemplate на нужный тип. Плюс иногда делаю классы, у которых есть внутри интерналовский индекс в коллекции, и автоматически его подчуфаниваю по адд/ремов.
Кстати, там сейчас нет проверок, афаир.
#region SomeObjectTemplateCollection
/// <summary>
/// Template class for strongly-typed collections.
/// Ready for ctrl-C ctrl-V into your code, and then ctrl-H
/// "SomeObject" with your class or struct
/// </summary>
internal class SomeObjectTemplateCollection : ICloneable
{
/// <summary>
/// Empty collection
/// </summary>
public static readonly SomeObjectTemplateCollection Empty = null;
private SomeObjectTemplate[] innerArray = null;
private int capacity;
private int count;
/// <summary>
/// Number of items on the collection
/// </summary>
public int Count
{
get { return count; }
}
/// <summary>
/// Current maximum number of items in the collection
/// </summary>
public int Capacity
{
get { return capacity; }
}
/// <summary>
/// Converts collection to array
/// </summary>
/// <returns></returns>
public SomeObjectTemplate[] ToArray
{
SomeObjectTemplate[] arr = new SomeObjectTemplate[count];
for (int i = 0; i < count; i++)
{
arr[i] = innerArray[i];
}
return arr;
}
/// <summary>
/// Indexer
/// </summary>
public SomeObjectTemplate this[int index]
{
get
{
if (index >= count)
{
throw new ArgumentOutOfRangeException("Index out of bounds");
}
return innerArray[index];
}
set
{
if (index >= count)
{
throw new ArgumentOutOfRangeException("Index out of bounds");
}
innerArray[index] = value;
}
}
/// <summary>
/// Removes all objects from the collection
/// </summary>
public void Clear
{
innerArray.Initialize;
this.count = 0;
}
/// <summary>
/// Adds an object to a collection
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public int Add(SomeObjectTemplate value)
{
if (count == capacity)
{
capacity *= 2;
SomeObjectTemplate[] newArr = new SomeObjectTemplate[capacity];
innerArray.CopyTo(newArr, 0);
innerArray = newArr;
}
innerArray[count] = value;
return count++;
}
/// <summary>
/// Adds a collection of objects to a collection
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public void Add(SomeObjectTemplateCollection value)
{
int newCapacity = capacity;
while (count + value.Capacity >= newCapacity)
// Use capacity here coz later I do value.innerArray.CopyTo
{
newCapacity *= 2;
}
if (newCapacity != capacity)
{
// Increase size.
capacity = newCapacity;
SomeObjectTemplate[] newArr = new SomeObjectTemplate[capacity];
innerArray.CopyTo(newArr, 0);
innerArray = newArr;
}
value.innerArray.CopyTo(innerArray, count);
count+= value.count;
}
/// <summary>
/// Removes item at index, replacing it with the last item and reducing count by one
/// </summary>
/// <param name="index"></param>
public void RemoveAt(int index)
{
if (index >= count)
{
throw new ArgumentOutOfRangeException("Index out of bounds");
}
innerArray[index] = innerArray[count - 1];
count--;
}
/// <summary>
/// Ctor
/// </summary>
/// <param name="initialSize"></param>
public SomeObjectTemplateCollection(int initialSize)
{
capacity = initialSize;
count = 0;
innerArray = new SomeObjectTemplate[capacity];
}
/// <summary>
/// Ctor
/// </summary>
public SomeObjectTemplateCollection
{
capacity = 64;
count = 0;
innerArray = new SomeObjectTemplate[capacity];
}
/// <summary>
/// Static ctor
/// </summary>
static SomeObjectTemplateCollection
{
Empty = new SomeObjectTemplateCollection(0);
}
/// <summary>
/// Creates a copy of the collection. Collection contents (items) are not cloned.
/// </summary>
/// <returns></returns>
public object Clone
{
SomeObjectTemplateCollection newCol = new SomeObjectTemplateCollection(this.capacity);
this.innerArray.CopyTo(newCol.innerArray, 0);
return newCol;
}
}
#endregion
public class MyTypeCollection : ReadOnlyCollectionBase
{
public void Add(MyType item)
{
InnerList.Add(item);
}
public MyType this[int index]
{
get
{
return (MyType) InnerList[index];
}
set
{
InnerList[index] = value;
}
}
}
2. Если C# версии 2.0, то там появились generics (аналоги шаблонов)
List<MyType> - это как раз и есть типизированный ArrayList
скачай кодогенератор CodeSmith - там есть шаблоны для любых типизированнах коллекций
Спасибо. Громоздко все это - буду использовать когда требуется эффективность, а если что-то по мелочи писать - буду юзать ArrayList (писать быстрее)
Оставить комментарий
Dmitriy82
Как я понимаю, в шарпе есть 2 вида массивов:встроенные ( int[] ) и класс ArrayList.
У встроенных недостаток что нельзя изменять длину после создания, а у
ArrayList'ов - то что они хранят элементы типа object.
Существует ли подход, лишенный обоих недостатков?
(а то достало писать нечто типа
( (PredicateDefinition)PredicateDefintions).name,
и плюс невозможна статическая проверка типов)