C#使用foreach迭代包含2个不同对象类的列表

时间:2013-12-05 20:52:20

标签: c# list casting foreach

这是我的问题。

我有两个类都继承自一个普通的类。 I.E汽车级和厢式车级,都继承了车辆类。我将它们添加到了车型的通用列表中。汽车类具有noofseats属性,并且货车具有权重属性。有没有办法使用foreach循环迭代它们并根据它们是汽车类还是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'。'

有没有一种简单的方法可以解决这个问题,还是不可能?感谢

5 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:4)

您需要按类型对其进行过滤,这很简单归功于Linq:

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

}

答案 2 :(得分:3)

只需检查'是'检查对象是否与给定类型兼容。检查MSDN

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

答案 3 :(得分:2)

对我来说,多态性的全部意义在于我不关心我的对象究竟是什么基础类型。虽然您可以使用此处已提到的不同方法轻松检查它的类型,但我的答案是根本不这样做。相反,您应该将不同的行为抽象为一个公共函数,而是调用该方法。快速举例:

   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种不同的车型时,你可以很容易地看到它的优势。

答案 4 :(得分:0)

    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; }

    }
}