从数组列表中写入几个对象值到控制台

本文关键字:几个 对象 控制台 列表 数组 | 更新日期: 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>代替