【问题标题】:Writing several object values from a Arraylist to Console将 Arraylist 中的多个对象值写入控制台
【发布时间】:2015-12-28 11:18:35
【问题描述】:

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

最好的问候。

【问题讨论】:

  • 为什么不呢?有什么问题?
  • 这是一个非通用的ArrayList
  • 它是一个非泛型的ArrayList。
  • 问题是我无法通过编写 list[i].propertyname 找到属性。属性名称不存在。通过智能感知找不到任何东西。所以我根本无法列出任何属性..
  • 您需要使用List&lt;T&gt;

标签: c# object arraylist console-application


【解决方案1】:

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

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

【讨论】:

  • 我遇到了与其他解决方案相同的问题。如果我在 ArrayList 中有多个对象,则循环为列表中的每个属性写入相同的值。
  • 变量是瑞典语,抱歉。但是代码现在就在那里。
  • @MarcusPersson 这是因为您只创建了一个 Bil 实例,因为它是一个类,所以它是一个引用类型。每次您将一个实例插入到您的 bilar 集合中时,它都是同一个实例,因此您最终会在列表中得到一堆引用同一个对象的条目。
  • 将对象实例替换到 do-while 循环中并且它可以工作。感谢您的帮助。
【解决方案2】:

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

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

如果您确定 ArrayList 中的每个对象都是Car,则此方法有效。如果不是,这将爆炸。你可以绕过它,但我建议你使用通用的List&lt;Car&gt;,因为这样你以后就不必投射对象了。

【讨论】:

  • 它可以写出值。但是,如果我将例如两辆车添加到 ArrayList 中,它会为每个对象写出相同的值。
  • 当然,您必须将其包含在 for 循环中。我将编辑我的答案。
  • 还是不行。我仍然将相同的值写入控制台。如果我使用 arraylist.Insert(index, object) 方法,它是替换该索引处的前一个对象还是使旧对象移动到 i + 1?
【解决方案3】:

ArrayList 不是通用集合。 ArrayList 索引返回一个对象值。要执行您想要的操作,您必须将 Cars[i] 转换为 Car 类型。

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

【讨论】:

    【解决方案4】:

    好吧,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&lt;Car&gt; 代替

    【讨论】:

      猜你喜欢
      • 2017-03-31
      • 2019-04-27
      • 1970-01-01
      • 2017-10-24
      • 2014-01-29
      • 2020-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多