从数组列表中写入几个对象值到控制台
本文关键字:几个 对象 控制台 列表 数组 | 更新日期: 2023-09-27 18:15:14
我正在编写一个控制台应用程序,并且在将所有对象属性值写入控制台时遇到了问题。我有一个类,所有的属性,但我不能达到他们,因为我做一个正常的列表。例如,一个普通的列表循环可以是这样的,属性为example (carBrand),列表名为Cars。
for (int i = 0; i < Cars.Length; i++)
{
Console.WriteLine(Cars[i].carBrand)
}
但是对于数组列表,这似乎不起作用。为什么呢?我一直在寻找不同的方法,但没有得到任何好的结果……
代码:static void Main(string[] args)
{
int menyval;
ArrayList bilar = new ArrayList();
Bil nybil = new Bil();
string ägareefter;
do
{
Console.WriteLine("'nVälkommen till Dimmans Bilrace!");
Console.WriteLine("Vi har {0} bilar i race just nu.", nybil.IRace);
Console.WriteLine("'nVälj något alternativ i menyn nedan, klicka sedan ENTER:");
Console.WriteLine("'n1. Lägg till en bil först.");
Console.WriteLine("2. Lägg till en bil sist.");
Console.WriteLine("3. Lägg till en bil efter en annan bil.");
Console.WriteLine("4. Visa alla bilar i listan.");
Console.WriteLine("0. Avsluta programmet.");
Console.Write("'nDitt val:");
menyval = int.Parse(Console.ReadLine());
switch (menyval)
{
case 0:
Console.WriteLine("Programmet kommer nu avslutas. Tryck på valfri knapp.");
Console.ReadKey();
break;
case 1:
Console.WriteLine("'nLägg till en bil först. Skriv in det som efterfrågas och avsluta med ENTER.");
Console.WriteLine("Ange ägarens namn:");
nybil.Ägarnamn = Console.ReadLine();
Console.WriteLine("Ange tillverkarens namn:");
nybil.Tillverkarnamn = Console.ReadLine();
Console.WriteLine("Ange modellens namn:");
nybil.Modellnamn = Console.ReadLine();
bilar.Insert(0, nybil);
nybil.LäggTillBiliRace(1);
Console.WriteLine("Nu har bilen lagts till i racet. Klicka på valfri knapp för att fortsätta.");
Console.ReadKey();
break;
case 2:
Console.WriteLine("'nLägg till en bil sist. Skriv in det som efterfrågas och avsluta med ENTER.");
Console.WriteLine("Ange ägarens namn:");
nybil.Ägarnamn = Console.ReadLine();
Console.WriteLine("Ange tillverkarens namn:");
nybil.Tillverkarnamn = Console.ReadLine();
Console.WriteLine("Ange modellens namn:");
nybil.Modellnamn = Console.ReadLine();
bilar.Add(nybil);
nybil.LäggTillBiliRace(1);
Console.WriteLine("Nu har bilen lagts till i racet. Klicka på valfri knapp för att fortsätta.");
Console.ReadKey();
break;
case 3:
Console.WriteLine("'nLägg till en bil efter en annan bil. Skriv in det som efterfrågas och avsluta med ENTER.");
Console.WriteLine("Följande bilar har vi:");
for (int i = 0; i < bilar.Count; i++)
{
Console.WriteLine("[Bil " + i + ": " + "Ägare = " + ((Bil)bilar[i]).Ägarnamn + ", "
+ "Tillverkare = " + ((Bil)bilar[i]).Tillverkarnamn + ", Modell = " +
((Bil)bilar[i]).Modellnamn + "]");
}
Console.Write("'nAnge namnet på ägaren som du vill placera den nya bilen efter:");
ägareefter = Console.ReadLine();
break;
case 4:
if (bilar.Count != 0)
{
Console.WriteLine("'nVisar alla bilar i listan:");
for (int i = 0; i < bilar.Count; i++)
{
Console.WriteLine("[Bil " + i + ": " + "Ägare = " + ((Bil)bilar[i]).Ägarnamn + ", "
+ "Tillverkare = " + ((Bil)bilar[i]).Tillverkarnamn + ", Modell = " +
((Bil)bilar[i]).Modellnamn + "]");
}
}
else
{
Console.WriteLine("'nListan innehåller inga bilar än. Klicka på valfi knapp för att komma till startmenyn");
Console.ReadKey();
}
break;
default:
Console.WriteLine("'n Fel! Ange en siffra mellan de angivna värdena som finns. Tryck valfri knapp för att fortsätta.");
Console.ReadKey();
break;
}
} while (menyval != 0);
}
}
}
类代码:class Bil
{
private string _ägarNamn;
private string _tillverkarnamn;
private string _modellnamn;
private int _iRace;
ArrayList billista = new ArrayList();
public Bil()
{
_ägarNamn = "";
_tillverkarnamn = "";
_modellnamn = "";
}
public Bil(string ägarnamn, string tillverkarnamn, string modell)
{
_ägarNamn = ägarnamn;
_tillverkarnamn = tillverkarnamn;
_modellnamn = modell;
}
public string Ägarnamn
{
get { return _ägarNamn; }
set { _ägarNamn = value; }
}
public string Tillverkarnamn
{
get { return _tillverkarnamn; }
set { _tillverkarnamn = value; }
}
public string Modellnamn
{
get { return _modellnamn; }
set { _modellnamn = value; }
}
public int IRace
{
get { return _iRace; }
set { _iRace = value; }
}
public void LäggTillBiliRace(int i)
{
IRace += i;
}
问好。
ArrayList是非泛型类型,因此其中的所有元素都是对象。你应该先转换数组列表:
foreach (var car in cars.Cast<Car>())
{
Console.WriteLine(car.carBrand)
}
由于ArrayList
不是泛型的,编译器不知道该列表中的对象类型。要访问这些属性,必须对它们进行强制转换:
for(int i = 0; i < Cars.Count; i++)
{
Console.WriteLine(((Car)Cars[i]).carBrand);
}
如果你确定数组列表中的每个对象都是Car
,则此操作有效。如果不是,就会爆炸。你可以规避这一点,但我建议你使用通用的List<Car>
,这样你就不必在以后强制转换对象了。
ArrayList不是泛型集合。数组列表索引返回一个对象值。要做您想做的事情,您必须将Cars[i]强制转换为Car类型。
for (int i = 0; i < Cars.Count; i++)
{
Console.WriteLine((Car)Cars[i].carBrand);
}
好吧,ArrayList
包含Object
项,所以你必须过滤掉Car
项:
// I suggest creating a "report" string which is more flexible then loop:
// you can show the report in console, write into file etc. in one line
String report = String.Join(Environment.NewLine, cars
.OfType<Car>() // Cars only
.Select(car => car.carBrand)); // Brand from each car
// Just one simple line
Console.WriteLine(report);
注:ArrayList
是一个过时的类,尝试使用List<Car>
代替