这是我根据一些现有答案制作的一小部分辅助方法。它利用扩展和静态方法以及参考参数来实现最大理想:
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);