将几个对象值从Arraylist写入Console

时间:2015-09-30 15:27:21

标签: c# object arraylist console-application

我正在编写一个控制台应用程序,我遇到了将所有对象属性值写入控制台的问题。我得到了一个具有所有属性的课程,但是我无法像普通列表那样联系到他们。例如,一个普通的列表循环可能是这样的,使用propertys examples(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 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;
    }

最诚挚的问候。

4 个答案:

答案 0 :(得分:3)

ArrayList是非泛型类型,因此其中的所有元素都是对象。 您应该首先转换ArrayList:

foreach (var car in cars.Cast<Car>())
{
    Console.WriteLine(car.carBrand)
}

答案 1 :(得分:2)

由于ArrayList不是通用的,因此编译器不知道该列表中的对象类型。要访问属性,您必须强制转换它们:

for(int i = 0; i < Cars.Count; i++)
{
    Console.WriteLine(((Car)Cars[i]).carBrand);
}

如果您确定该ArrayList中的每个对象都是Car,则此方法有效。如果不是,那就会爆炸。你可以规避这一点,但我建议你使用通用List<Car>,因为你以后不必再投射对象。

答案 2 :(得分:1)

ArrayList不是通用集合。 ArrayList索引返回一个对象值。要做你想做的事,你必须把Cars [i]变成Car类型。

  for (int i = 0; i < Cars.Count; i++)
  {
     Console.WriteLine((Car)Cars[i].carBrand);
  }

答案 3 :(得分:1)

好吧,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是一个过时的类,请尝试使用List<Car>