[英]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.