Вот небольшая коллекция вспомогательных методов, которые я создал на основе некоторых из существующих ответов. Он использует как расширения, так и статические методы с опорными параметрами для максимальной идеальности:
public static class Arr
{
public static int IndexOf<TElement>(this TElement[] Source, TElement Element)
{
for (var i = 0; i < Source.Length; i++)
{
if (Source[i].Equals(Element))
return i;
}
return -1;
}
public static TElement[] Add<TElement>(ref TElement[] Source, params TElement[] Elements)
{
var OldLength = Source.Length;
Array.Resize(ref Source, OldLength + Elements.Length);
for (int j = 0, Count = Elements.Length; j < Count; j++)
Source[OldLength + j] = Elements[j];
return Source;
}
public static TElement[] New<TElement>(params TElement[] Elements)
{
return Elements ?? new TElement[0];
}
public static void Remove<TElement>(ref TElement[] Source, params TElement[] Elements)
{
foreach (var i in Elements)
RemoveAt(ref Source, Source.IndexOf(i));
}
public static void RemoveAt<TElement>(ref TElement[] Source, int Index)
{
var Result = new TElement[Source.Length - 1];
if (Index > 0)
Array.Copy(Source, 0, Result, 0, Index);
if (Index < Source.Length - 1)
Array.Copy(Source, Index + 1, Result, Index, Source.Length - Index - 1);
Source = Result;
}
}
Производительность мудрая, она приличная, но, вероятно, ее можно улучшить. Remove
опирается на IndexOf
, и для каждого элемента, который вы хотите удалить, создается новый массив, вызывая RemoveAt
.
IndexOf
- единственный метод расширения, так как ему не нужно возвращать исходный массив. New
принимает несколько элементов некоторого типа для создания нового массива указанного типа. Все остальные методы должны принимать исходный массив в качестве ссылки, поэтому нет необходимости присваивать результат впоследствии, как это уже происходит внутри.
Я бы определил Merge
метод для объединения двух массивов; однако это уже может быть достигнуто с помощью метода Add
путем передачи фактического массива вместо нескольких отдельных элементов. Следовательно, Add
может использоваться следующими двумя способами для объединения двух наборов элементов:
Arr.Add<string>(ref myArray, "A", "B", "C");
или
Arr.Add<string>(ref myArray, anotherArray);