因为项目需求,我要写一个比较复杂的算法,先谷歌之,还真给我找到一个相同的算法,哈哈,不用这么麻烦自己写算法了,爽!但是在网上找到的源代码为C++写就,里面有不少动态数组的使用,于是我想当然的用ArrayList替代之,但……结果却发现有问题!仔细一看,原来C++里采用了CArray,可以直接使用myArr[5] = 5;这种赋值方式,而不用先对index1至4赋值。。。C#里的ArrayList显然没有这种功能。。。
无奈,自己开动脑筋,对ArrayList作了如下改进:
class MyArrayList
{
private ArrayList data = new ArrayList();
public MyArrayList()
{
}
public Object this[int idx]
{
get
{
if (idx > -1 && idx < data.Count)
{
return (data[idx]);
}
else
{
throw new InvalidOperationException("[MyArr.set_Item] Index out of range");
}
}
set
{
if (idx > -1 && idx < data.Count)
{
data[idx] = value;
}
else if (idx == data.Count)
{
data.Add(value);
}
else if (idx > data.Count)
{
for (int i = data.Count; i < idx; i++)
{
data.Add(null);
}
data.Add(value);
}
else
{
throw new InvalidOperationException("[MyArr.set_Item] Index out of range");
}
}
}
public int Count
{
get
{
return data.Count;
}
}
public void Add(Object obj)
{
data.Add(obj);
}
public Array ToArray(Type type)
{
if (type == null)
{
throw new ArgumentNullException("type");
}
Array array1 = Array.CreateInstance(type, data.Count);
array1 = data.ToArray(type);
return array1;
}
}
这样改进之后,使用起来就既可以用ArrayList的方法,如Add啊,ToArray啊之类的,也可以用myArr[5] = 5;之类的语句直接对某个特定的元素进行赋值了,然后只要把原文中的ArrayList替换为MyArrayList即可
附使用例程:
MyArrayList myArr = new MyArrayList();
myArr[1] = "bbb"; //如果使用ArrayList,这里会报错
if (myArr[0] != null)
{
Console.WriteLine(myArr[0].ToString());
}
if (myArr[1] != null)
{
Console.WriteLine(myArr[1].ToString());
}
myArr[0] = "ccc";
string[] temp = (string[])myArr.ToArray(typeof(string));