从list <anothertype> </anothertype> </sometype>返回列表<sometype>

时间:2014-09-24 03:47:12

标签: c# list generics ienumerable

我正在努力简化这个问题,所以请耐心等待。我知道使用接口,但对于我在中间的具体内容,我不太清楚如何将它拉下来。这不是一个sql数据库,我可以闭着眼睛睡着了。

我有一个整体通用的东西的列表,但在这个列表中是一些另一种类型的子元素。例如,汽车......以及每辆汽车内的其他东西,如轿车,轿跑车,敞篷车等款式等等。可以有很多其他的东西&#34;但是保持简单我将它作为对象列表,所以我不认为我可以查看它上面的接口选项。

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


List<Cars> allCars = GetAListOfCars();

所以,在这个有限的汽车列表中,我只想要敞篷车。

List<Convertibles> justConvs = HowToGetFrom "allCars".

虽然我试图将其简化为精神理解目的,但汽车是敞篷车的指标实际上是汽车类中的儿童对象。所以它几乎就像我需要做的那样......

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 个答案:

答案 0 :(得分: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>编写扩展方法,您可以选择。