作者rahim (forget it)
看板C_Sharp
标题Re: [问题] 如何用C#写一个动态阵列?
时间Mon Mar 26 17:41:54 2007
: 这样不行
: 观念还不是很清楚
: 推 tomex:看起来ok 03/24 00:59
: 推 tomex:不过list<>要用add()把值塞进去,未配大小时就充值不行 03/24 01:01
: 推 rahim:所以是改成arr.Add(new List<double>()); 03/24 04:02
: → rahim:下面改成arr[i].Add(i+j); 这样以後就可以用arr[i][j]了吗? 03/24 04:03
: → rahim:还有想请问一下List< >中间要放的是什麽? 03/24 04:04
: → rahim:为什麽我一开始用 03/24 04:05
: → rahim:List<List<double>> arr=new List<List<double>>(); 03/24 04:06
: → rahim:这样可以呢?(虽然是我自己想出来的,不过想听一下讲解) 03/24 04:07
: as tomex say
: 这种资料结构都要先Add()东西之後你才能去作给值得动作
: List<List<double>> arr = new List<List<double>>();
: 这句话代表arr这个List里放的是另一个List
: < >里头就是这个大箱子里头的型别的意思
: 而里头的那个List<double>代表这个List里面放的是double
: 跟ArrayList最大的不同点在於
: ArrayList无论你丢什麽东西进去他都先帮你转成object
: 所以你要取值的时候也只能拿到object
: 造成你必须要先强制Cast成你需要的资料型别後才能使用
: eg. ArrayList myarr = new ArrayList();
: myarr.Add(1);
: int a = (Int32)myarr[0];
: 所以List<>效率好
: (先规定好要放什麽资料就不需要去作Object型别的转换)
: 但是ArrayList弹性高
: (你可以乱放任何不同种类的东西进去,只要你取用的时候Cast成你想要的东西就可以)
: 而当你作 arr.Add(new List<double>()); 这个动作时
: 就代表将arr放进一个新的 List<double>
: 这时候arr[0]才确实存在在这个arr里
: 你若是还没有Add就去作 arr[0] = new List<double>();
: 这里的 "=" 有给值或是Modify的意思
: 你还没给他东西的实体你怎麽去modify他或是给值呢?
: 当然会有错误
: 就像有人命令你
: 将Arr第0号箱子里的红苹果涂成绿色
: 你这样Arr[0] = "green" 这样一定错
: 苹果都还没放进去怎麽上色
: 你当然得先
: Arr.Add(new Apple("red"));
: 才能去作
: Arr[0] = "green";
: 这样去想就对了
: 所以你的程式应该这样写
: List<List<double>> arr = new List<List<double>>();
: for (int i = 0; i < m; i++)
: {
: //arr[i] = new List<double>();错误
: arr[i].Add (new List<double>()); //正确
: for (int j = 0; j < n; j++)
: {
: //arr[i][j] = i + j;错误
: arr[i].Add(i+j); 正确
: ps. 其实以上这一行arr[i].Add(i+j)就等於以下两行
: arr[i].Add(new double());
: arr[i][j] = i + j;
: //不过你要注意
: //你的List里头是double
: //但是i+j是int
: //系统这里不会告知你 自己作转换
: //这种型别匹配错误的问题要小心
: //很多Bug就是在这种地方出来
: }
: }
: 其实你可以自己多try
: try久就懂了
: 如果你用的是VisualStudio就可以自己去Compile看看
: 然後执行时下中断点让程式停住
: 然後去看区域变数里头的arr里头的值对不对
: 像这个程式你还可以去观察一下arr.Capacity这个属性
: 你会发现他一直在有规律的长大
: 摸熟了这个资料结构的运作方式跟细节
: 以後你用起来自然得心应手
: 我相信这些MSDN都有写吧
: 你可以深入研究一下
对了 如果我想把动态阵列当作class A的data member,下面这样子写可以吗?
class A
{
public List<List<T>> arr = new List<List<T>>();
public A()
{
List<List<T>> arr = new List<List<T>>();
for (int i = 0; i < 10; i++)
{
arr.Add(new List<T>());
for (int j = 0; j < 10; j++)
{
arr[i].Add(new T());
}
}
}
}
上面这样写完以後,以後要存取动态阵列里面的东西
是像 A a=new A();
a.arr[i][j]就可以用了吗?
还有如果T是一个struct
ex: struct T
{
public int n;
public T
{
n=10;
}
}
如果我想要存取T里面的n的话 n其实是a.arr[i][j].n吗?
我的目的:是想要10个大盒子里面,各装10个小盒子
而每个小盒子里面,又装着一个袋子T(我用struct来写)
袋子T里面可以装很多东西
请问我上面这样写好吗?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.119.144.40
1F:推 GreatShot:你为什麽不自己try try 去compile看看呢..^^; 03/26 23:21
2F:→ GreatShot:看到error message就会知道错哪里了啊 XD 03/26 23:22
3F:推 rahim:一开始有错@@ 後来终於改好了^^ 03/27 02:02
4F:推 rahim:後来觉得袋子T用class写好像比较好 03/29 03:26
5F:→ rahim:我用struct写 像arr[i][j].XXX=000 这种东西(写在class中) 03/29 03:27
6F:→ rahim:但compile不给我过 改用class写後 就给我过了 03/29 03:28
7F:→ rahim:也不知道为什麽@@ 03/29 03:29
8F:推 rahim:它说无法修改xxx的传回值 因为不是变数型别 03/29 03:32