Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#使用foreach遍历包含两个不同对象类的列表_C#_List_Casting_Foreach - Fatal编程技术网

C#使用foreach遍历包含两个不同对象类的列表

C#使用foreach遍历包含两个不同对象类的列表,c#,list,casting,foreach,C#,List,Casting,Foreach,这是我的问题 我有两个类,它们都继承自一个公共类。例如,一个car类和一个van类都继承自一个vehicle类。我将它们添加到一个常见的车辆类型列表中。car类具有noofseat属性,van具有weight属性。有没有一种方法可以使用foreach循环和基于它们是car类还是van类的输出对它们进行迭代 foreach (van v in vehiclelist) { lsttest.Items.Add(v.weight;) } foreach (car c in vehiclelist

这是我的问题

我有两个类,它们都继承自一个公共类。例如,一个car类和一个van类都继承自一个vehicle类。我将它们添加到一个常见的车辆类型列表中。car类具有noofseat属性,van具有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”类型。”


有没有一个简单的方法来解决这个问题,还是根本不可能?谢谢

只需使用“is”检查对象是否与给定类型兼容。检查


只需使用“is”检查对象是否与给定类型兼容。检查


您需要按类型对其进行过滤,这很容易,因为Linq:

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

}

您需要按类型对其进行过滤,这很容易,因为Linq:

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

}
foreach(车辆列表中的van v类型())
{
}
foreach(车辆列表中的van v类型())
{
}
静态void Main(字符串[]args)
{
var车辆=新列表();
添加(新车(){noofseat=2});
添加(新车(){noofseat=4});
车辆.添加(新货车(){Weight=2000});
车辆。添加(新厢式货车(){Weight=3000});
foreach(车辆中的var车辆)
{
如果(车辆是汽车)
{
Console.WriteLine(“我是一辆车”);
}
如果(车辆为厢式货车)
{
Console.WriteLine(“我是一辆货车”);
}
}
Console.ReadKey();
}
等级车辆
{
}
汽车类别:汽车
{
公共int NoOfSeats{get;set;}
}
货车类别:车辆
{
公共整数权重{get;set;}
}
}
静态void Main(字符串[]args)
{
var车辆=新列表();
添加(新车(){noofseat=2});
添加(新车(){noofseat=4});
车辆.添加(新货车(){Weight=2000});
车辆。添加(新厢式货车(){Weight=3000});
foreach(车辆中的var车辆)
{
如果(车辆是汽车)
{
Console.WriteLine(“我是一辆车”);
}
如果(车辆为厢式货车)
{
Console.WriteLine(“我是一辆货车”);
}
}
Console.ReadKey();
}
等级车辆
{
}
汽车类别:汽车
{
公共int NoOfSeats{get;set;}
}
货车类别:车辆
{
公共整数权重{get;set;}
}
}

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

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

这样做的好处是,现在我可以在各地重复使用相同的方法,而不必关心我到底是什么类型的人。现在我可以用一辆车做各种很酷的事情(API等):以后,如果我想添加不同的车型,我不需要做任何更改。我创建了一种新的车辆类型,实现了GetMeasurement()函数,它神奇地工作了。当你开始使用3、5、15种不同的车辆类型时,你可以很容易地看到这里的优势。

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

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

这样做的好处是,现在我可以在各地重复使用相同的方法,而不必关心我到底是什么类型的人。现在我可以用一辆车做各种很酷的事情(API等):以后,如果我想添加不同的车型,我不需要做任何更改。我创建了一种新的车辆类型,实现了GetMeasurement()函数,它神奇地工作了。当您开始购买3、5、15种不同的车型时,您可以很容易地看到这里的优势。

为什么要投否决票<代码>OfType在其实现中做了一些非常类似的事情。我也不理解否决票。答案当然是正确的。他们讨厌自由!;)
.OfType()
类似于
。其中(x=>x为Van)。选择(x=>(Van)x)
。选择(x=>x为Van)。其中(x=>x!=null)
,除了如果源代码仅为非泛型
IEnumerable
,则这些构造不可用。为什么要进行下一票<代码>OfType在其实现中做了一些非常类似的事情。我也不理解否决票。答案当然是正确的。他们讨厌自由!;)
.OfType()
类似于
。其中(x=>x为Van)。选择(x=>(Van)x)
。选择(x=>x为Van)。其中(x=>x!=null)
除非这些结构不可用,如果源代码只是非通用的
IEnumerable
。您可以使用发布的任何一个答案,但我更关心的是您为什么需要这样做?这有点糟糕的设计。我同意阿蒂的观点。你可以在这里做你想做的事情,而不必检查类型:见下面我的答案谢谢大家。我让它工作得很好!您可以使用张贴的任何一个答案,但我更关心的是您为什么需要这样做?这有点糟糕的设计。我同意阿蒂的观点。你可以在这里做你想做的事情,而不必检查类型:见下面我的答案谢谢大家。我让它工作得很好!谢谢,这太棒了。这是最好的!谢谢,这太棒了。这是最好的!
   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());
  }