簡體   English   中英

C#使用foreach遍歷包含2個不同對象類的列表

[英]C# Using foreach to iterate through a list containing 2 different object classes

這是我的問題。

我有兩個類都從同一個類繼承。 IE包括汽車類和廂式汽車類,它們都繼承自汽車類。 我將它們添加到常見的車輛類型列表中。 汽車類具有noofseats屬性,而面包車具有weight屬性。 有沒有一種方法可以使用foreach循環遍歷它們,並根據它們是car類還是van類來輸出?

foreach (van v in vehiclelist)
{
  lsttest.Items.Add(v.weight;)
}

foreach (car c in vehiclelist)
{
  lsttest.Items.Add(c.nofoseats;)
}

我收到錯誤消息:“無法將類型為“ Test.Car”的對象轉換為類型為“ Test.Van”。

有沒有簡單的方法可以解決此問題,或者根本不可能? 謝謝

foreach (van v in vehiclelist.OfType<Van>())
{
}

您需要按類型對其進行過濾,這要歸功於Linq:

foreach (van v in vehiclelist.Where(x=>x is van))
{

}

只需使用' is'檢查對象是否與給定類型兼容。 檢查MSDN

 foreach (vehicle c in vehiclelist)     
 {
    if(c is car)
    {
        //do this
    }
    else 
    { 
        //else it should be a van              
    }
 }

對我來說,多態性的全部目的是讓我不在乎我的對象到底是什么底層類型。 盡管您可以使用此處已經提到的不同方法輕松地檢查出哪種類型,但我的答案是完全不要這樣做。 相反,您應該將不同的行為抽象為一個通用函數,然后調用該方法。 快速示例:

   class Vehicle
    {
        abstract public int GetMeasurement();
    }

    class Car : Vehicle
    {
       //cars are measured in numberOfSeats
       override public int GetMeasurement()
       {
          return numberOfSeats;
       }

        private int numberOfSeats;
    }

   class Van: Vehicle
   {
       //vans are measured by weight
       override public int GetMeasurement()
       {
          return weight;
       }

      private int weight;
   }

  foreach (Vehicle v in vehiclelist)
  {
     //I don't need to do any type checking: 
     //polymorphism magically gets the right value for me
     lsttest.Items.Add(v.GetMeasurement());
  }

這樣做的好處是,現在我可以在各地重復使用相同的方法,而不必關心我真正的類型。 現在,我可以使用Vehicle進行各種有趣的事情(API等):以后,如果我想添加不同的車輛類型,則無需進行任何更改。 我創建了一種新的車輛類型,實現了GetMeasurement()函數,它神奇地起作用了。 當您開始購買3、5、15種不同的車型時,您可以在這里輕松地看到優勢。

    static void Main(string[] args)
    {
        var vehicles = new List<Vehicle>();
        vehicles.Add(new Car() { NoOfSeats = 2 });
        vehicles.Add(new Car() { NoOfSeats = 4 });
        vehicles.Add(new Van() { Weight = 2000 });
        vehicles.Add(new Van() { Weight = 3000 });


        foreach (var vehicle in vehicles)
        {
            if (vehicle is Car)
            {
                Console.WriteLine("I'm a car");
            }
            if (vehicle is Van)
            {
                Console.WriteLine("I'm a van");
            }
        }

        Console.ReadKey();

    }

    class Vehicle
    {

    }

    class Car : Vehicle
    {
        public int NoOfSeats { get; set; }
    }

    class Van : Vehicle
    {
        public int Weight { get; set; }

    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM