C#使用foreach遍历包含两个不同对象类的列表
这是我的问题 我有两个类,它们都继承自一个公共类。例如,一个car类和一个van类都继承自一个vehicle类。我将它们添加到一个常见的车辆类型列表中。car类具有noofseat属性,van具有weight属性。有没有一种方法可以使用foreach循环和基于它们是car类还是van类的输出对它们进行迭代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
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());
}