将多个对象值从 Arraylist 写入控制台
Writing several object values from a Arraylist to Console
我正在编写控制台应用程序,但在将所有对象 属性 值写入控制台时遇到问题。我得到了一个 class,其中包含所有 属性,但我无法像处理普通列表那样访问它们。例如,一个普通的列表循环可能是这样的,其中包含 属性s 个示例 (carBrand) 和列表名称 Cars。
for (int i = 0; i < Cars.Length; i++)
{
Console.WriteLine(Cars[i].carBrand)
}
但是对于 ArrayList 这似乎不起作用。这是为什么?我一直在四处寻找不同的方法,但没有从中得到任何好处...
代码:
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代码:
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
不是通用的,编译器不知道该列表中的对象类型。要访问这些属性,您必须转换它们:
for(int i = 0; i < Cars.Count; i++)
{
Console.WriteLine(((Car)Cars[i]).carBrand);
}
如果您确定 ArrayList 中的每个对象都是 Car
,则此方法有效。如果不是,这将爆炸。你可以绕过它,但我建议你使用通用的 List<Car>
,因为这样你以后就不必投射对象了。
ArrayList 是非泛型类型,因此其中的所有元素都是对象。
您应该首先投射 ArrayList:
foreach (var car in cars.Cast<Car>())
{
Console.WriteLine(car.carBrand)
}
ArrayList 不是通用集合。 ArrayList 索引 returns 一个对象值。要做你想做的事,你必须将 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);
P.S。 ArrayList
是一个 过时的 class,请尝试使用 List<Car>
而不是
我正在编写控制台应用程序,但在将所有对象 属性 值写入控制台时遇到问题。我得到了一个 class,其中包含所有 属性,但我无法像处理普通列表那样访问它们。例如,一个普通的列表循环可能是这样的,其中包含 属性s 个示例 (carBrand) 和列表名称 Cars。
for (int i = 0; i < Cars.Length; i++)
{
Console.WriteLine(Cars[i].carBrand)
}
但是对于 ArrayList 这似乎不起作用。这是为什么?我一直在四处寻找不同的方法,但没有从中得到任何好处...
代码:
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代码:
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
不是通用的,编译器不知道该列表中的对象类型。要访问这些属性,您必须转换它们:
for(int i = 0; i < Cars.Count; i++)
{
Console.WriteLine(((Car)Cars[i]).carBrand);
}
如果您确定 ArrayList 中的每个对象都是 Car
,则此方法有效。如果不是,这将爆炸。你可以绕过它,但我建议你使用通用的 List<Car>
,因为这样你以后就不必投射对象了。
ArrayList 是非泛型类型,因此其中的所有元素都是对象。 您应该首先投射 ArrayList:
foreach (var car in cars.Cast<Car>())
{
Console.WriteLine(car.carBrand)
}
ArrayList 不是通用集合。 ArrayList 索引 returns 一个对象值。要做你想做的事,你必须将 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);
P.S。 ArrayList
是一个 过时的 class,请尝试使用 List<Car>
而不是