将多个对象值从 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> 而不是