[〜#〜] h [〜#〜] ereは私のコード:floatを返すArrayListのArrayList:
public ArrayList paredes=new ArrayList();
public void Start()
{
paredes[0] = RetornaEmArrayList(279,275,0,0,90);
paredes[1] = RetornaEmArrayList(62,275,0,0,0);
paredes[2] = RetornaEmArrayList(62,275,62,0,90);
paredes[3] = RetornaEmArrayList(217,275,62,-62,0);
paredes[4] = RetornaEmArrayList(62,275,279,0,90);
paredes[5] = RetornaEmArrayList(41,275,279,0,0);
paredes[6] = RetornaEmArrayList(279,275,320,0,9);
paredes[7] = RetornaEmArrayList(320,275,0,-279,0);
for (int i = 0; i < paredes.Length; i++) {
float a = (float)paredes[i][0];
float b = (float)paredes[i][1];
float c = (float)paredes[i][2];
float d = (float)paredes[i][3];
float e = (float)paredes[i][4];
}
}
ArrayList RetornaEmArrayList(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:タイプ[オブジェクト]の式に[]を使用したインデックス作成を適用できません
私はすでにキャスティングをしました、何が悪いのですか? :(
問題はそれです paredes[i]
は、object
インデクサーの戻り型であるArrayList
を返します。アクセスするには、これをArrayList
にキャストする必要があります。
float a= (float)((ArrayList)paredes[i])[0];
ただし、より良い解決策は、ジェネリックスを使用して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
はList<List<float>>
とアクセサは次のように変更できます。
float a = paredes[i][0];
ArrayList
は、オブジェクトの種類を制限せずにオブジェクトを格納します。 ArrayList
に格納されているオブジェクトにアクセスすると、コンパイラーはオブジェクトのタイプを認識しないため、object
と入力するだけです。
ArrayList
のfloat
を外側のArrayList
に保存しています。常にフロートを格納しているので、内部リストにはList<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つの浮動小数点数があるため、float[]
の代わりにList<float>
を使用することもできます。
ArrayList
からList
に移動せずにコードを機能させたい場合は、追加のキャストが必要です。
float a = (float)((ArrayList)paredes[i])[0];
ただし、代わりにList<float>
を使用する方がずっとクリーンです。
どこでキャストしていますか?
私はそれがそうでなければならない(コンパイラで試さなかった)と言うでしょう:
for (int i = 0; i < paredes.Length; i++)
{
float a=(float)((ArrayList)paredes[i])[0];
...
}
代わりにジェネリックコレクションの使用を検討しましたか?
public List<List<float>> paredes = new List<List<float>>();
コードは次のようになります。
//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];
}