15

这是我的代码:返回浮点数的ArrayList的 ArrayList:

public ArrayList walls=new ArrayList(); 

public void Start()
{
    walls[0] = ReturnInArrayList(279,275,0,0,90);
    walls[1] = ReturnInArrayList(62,275,0,0,0);
    walls[2] = ReturnInArrayList(62,275,62,0,90);
    walls[3] = ReturnInArrayList(217,275,62,-62,0);
    walls[4] = ReturnInArrayList(62,275,279,0,90);
    walls[5] = ReturnInArrayList(41,275,279,0,0);
    walls[6] = ReturnInArrayList(279,275,320,0,9);
    walls[7] = ReturnInArrayList(320,275,0,-279,0); 

    for (int i = 0; i < walls.Length; i++) {
        float a = (float)walls[i][0];
        float b = (float)walls[i][1];
        float c = (float)walls[i][2];
        float d = (float)walls[i][3];
        float e = (float)walls[i][4];
    }
}

ArrayList ReturnInArrayList(float a,float b,float c, float d, float e)
{
    ArrayList arrayList = new ArrayList();
    arrayList.Add(a);
    arrayList.Add(b);
    arrayList.Add(c);
    arrayList.Add(d);
    arrayList.Add(e);
    return arrayList;
}

它给了我以下错误:

错误 CS0021:无法使用 [] 将索引应用于“对象”类型的表达式

我已经做了选角,有什么问题吗?:(

4

4 回答 4

11

问题是paredes[i]返回的是索引器object的返回类型。ArrayList您需要将其转换为 anArrayList才能访问它:

float a= (float)((ArrayList)paredes[i])[0];

不过,更好的解决方案是使用泛型并填充 a List<float>

List<float> RetornaEmList(float a,float b,float c, float d, float e)
{
    return new List<float> { a, b, c, d, e };
}

然后paredes是 aList<List<float>>并且您的访问器可以更改为:

float a = paredes[i][0];
于 2012-12-22T16:28:04.753 回答
3

ArrayList存储对象而不限制这些对象的类型。当您访问存储在 中的对象时ArrayList,编译器不知道它们是什么类型,所以它只给您 type object

你在你的 external 中存储一个ArrayListof 。由于您总是存储浮点数,因此最好将 a用于内部列表,将 a用于外部列表。这样您就不必键入 cast from :floatArrayListList<float>List<List<float>>object

using System.Collections.Generic;

public List<List<float>> paredes = new List<List<float>>();   


Start() {
    paredes[0]=RetornaEmList(279,275,0,0,90);
    paredes[1]=RetornaEmList(62,275,0,0,0);
    paredes[2]=RetornaEmList(62,275,62,0,90);
    paredes[3]=RetornaEmList(217,275,62,-62,0);
    paredes[4]=RetornaEmList(62,275,279,0,90);
    paredes[5]=RetornaEmList(41,275,279,0,0);
    paredes[6]=RetornaEmList(279,275,320,0,9);
    paredes[7]=RetornaEmList(320,275,0,-279,0);    



    for (int i=0;i<paredes.Length;i++)
    {           
        float a=paredes[i][0];
        float b=paredes[i][1];
        float c=paredes[i][2];
        float d=paredes[i][3];
        float e=paredes[i][4];                   
    }
}

List<float> RetornaEmList(float a,float b,float c, float d, float e)
{
    return new List<float> { a, b, c, d, e };
}

由于内部列表始终有 5 个浮点数,因此您也可以使用 afloat[]而不是 aList<float>

如果您只想使代码工作而不移动 from ArrayListto List,则需要额外的演员表:

float a = (float)((ArrayList)paredes[i])[0];

但只是使用它会更清洁List<float>

于 2012-12-22T16:32:15.370 回答
1

你在哪里做选角?

我会说它必须是(没有尝试使用编译器):

for (int i = 0; i < paredes.Length; i++)
{           
    float a=(float)((ArrayList)paredes[i])[0];
    ...                   
}

您是否考虑过使用泛型集合?

public List<List<float>> paredes = new List<List<float>>();   
于 2012-12-22T16:28:10.100 回答
0

代码应该是这样的:

//Adding List

paredes.Add(RetornaEmArrayList(279,275,0,0,90));
paredes.Add(RetornaEmArrayList(62,275,0,0,0));
paredes.Add(RetornaEmArrayList(62,275,62,0,90));
paredes.Add(RetornaEmArrayList(217,275,62,-62,0));
paredes.Add(RetornaEmArrayList(62,275,279,0,90));
paredes.Add(RetornaEmArrayList(41,275,279,0,0));
paredes.Add(RetornaEmArrayList(279,275,320,0,9));
paredes.Add(RetornaEmArrayList(320,275,0,-279,0));


//Traversing List

foreach(ArrayList item in paredes)
{
    float a=(float)item[0];
    float b=(float)item[1];
    float c=(float)item[2];
    float d=(float)item[3];
    float e=(float)item[4];
}
于 2012-12-22T16:32:31.723 回答