2014-09-24 104 views
1

我想簡化這個問題,請耐心等待。我知道如何使用接口,但對於我特別在使用接口的情況,我不太清楚如何使用接口。這不是一個sql數據庫,我可以閉着眼睡着。從列表中返回一個列表<SomeType><AnotherType>

我有一個類型的東西是整體通用的列表,但在這個列表中的是一些子元素,是另一種類型。例如,汽車......以及每輛汽車內都有其他的東西,比如風格等,如轎車,轎跑車,敞篷車等等。可以有許多其他的「東西」,但保持簡單我把它作爲一個列表的對象,所以我不認爲我可以看看它的界面選項。

public class Cars 
{ 
    public List<object> otherThingsAboutCar; 
} 


List<Cars> allCars = GetAListOfCars(); 

因此,在這個有限的汽車列表中,我只想要敞篷車。

雖然我試圖簡化它的精神理解的目的,指示燈,一個車是敞篷實際上是汽車類中的一個子對象。因此,它幾乎就像我需要做的是這樣......

foreach(Cars c in allCars) 
{ 
    if (c.otherThingsAboutCar is a convertible) 
     add this "c" to the List<Convertibles> 
} 

所以,雖然車是一種類型,我需要看看裏面的車另一個特定的元素,如果是這樣,只返回那些。我更喜歡像IEnumerable這樣的選項,如果它符合條件就會返回一個返回值,或者只返回一個提供的類型列表的函數。所以在這種情況下,我知道子組件的類型是Convertible,但可能有其他類型,所以我不能將它固定到只返回Convertibles的函數中。我研究了泛型並將它們理解爲一個級別,但如果在這個級別內,我想讓子級別成爲另一個級別,我將如何去解決這個問題。

希望解釋的是,這裏有一些樣品

Car1 
    otherThingsAboutCar 
     Sedan 
     6-Cyl 
     Leather 

Car2 
    otherThingsAboutCar 
     Convertible 
     8-Cyl 
     Leather 

Car3 
    otherThingsAboutCar 
     Convertible 
     6-Cyl 
     Leather 

Car3 
    otherThingsAboutCar 
     Coupe 
     6-Cyl 
     Cloth 

在這種情況下,我的外車列表中有4項。我想要一個只包含兩個敞篷車的數組(或類似的Enumerable/List /)。如前所述,我也可能從同一份名單開始,並說我只想要那些帶有皮革或8缸發動機的人,因此我想到了仿製藥,但無法將其包裹在其周圍。

回答

1

您可以使用泛型做到這一點,一個樣品的方法是這樣的:

public IEnumerable<Car> Select<T>(IEnumerable<Car> cars) 
{ 
    return cars.Where(c => c.otherThingsAboutCar.Any(other => other is T)); 
} 

示例用法:

var cars = new List<Car> { new Car { otherThingsAboutCar = new List<object> { new Sedan() } }, new Car { otherThingsAboutCar = new List<object> { new Convertible() } } }; 
var convertibles = Select<Convertible>(cars); 

請注意,您也可以編寫擴展方法IEnumerable<Car>中,選擇是你的。