在C#中查找数组中给定类型的元素

3

我有一个 Fleet 类,其中包含一个 (基类) Vehicles 数组。数组中的车辆是 Vehicles 的子类:Plains、Trains 和 Automobiles。该数组是私有的,但 Fleet 类必须提供一种方法来获取给定类型的车辆。

大致如下:

class Fleet
{
    private Vehicle[] _vehicles;

    // returns the vehicles of the specified subclass
    public ???? Get(????)
    {
        return ????
    }
}

Fleet fleet = new Fleet("fleet.def");

Trains[] trains = fleet.Get(Trains);   // looks clean but isn't possible
Plains[] plains = fleet.Get<Plains>(); // looks okay but don't know
                                       //   how to implement

我正在使用数组,但实际上任何可迭代的集合类型都可以。现在,正如您所看到的,我完全不知道如何实现这一点。我正在寻找一个优雅的解决方案来实现Get方法,效率并不是真正的问题。请在解决方案中命名涉及的关键技术,以便我可以在我的C#书籍中查找它们...谢谢!
3个回答

12

您的Fleet.Get()将如下所示

public IEnumerable<T> Get<T>()
{
  return _vehicles.OfType<T>();
}

非常感谢dh!看起来非常干净。现在我可以使用“foreach(Plain plain in fleet.Get <Plain>()){}”。我猜我也可以使用.ToList()和.ToArray()将结果存储在变量中?这个带有尖括号的技术叫什么(是的,我是一个新手,但并不感到羞耻)? - Fred K
那被称为泛型。这个想法是用具体类型替换可重用性(例如当您对不同类型执行类似操作时)。您可以在《泛型介绍》中了解更多信息,网址为http://msdn.microsoft.com/en-us/library/0x6a29h6.aspx。 - dh.
嗯,这个东西的名字有点太泛泛了 :-) 再次感谢,我还需要阅读一些资料... - Fred K

1
将其设为 List<> 并使用 FindAll(x => x.GetType() == typeof(Train)) 从列表中获取所有火车对象。

谢谢Gerrie,我下次会记住的:D - Bolek Tekielski

0
 public T[] Get<T>() where T : Vehicle
 {
     List<Vehicle> lstVehicles = new List<Vehicle>(_vehicles);
     return lstVehicles.FindAll(delegate(Vehicle vehicle){
         return vehicle.GetType() == typeof(T);
     }).ToArray();
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接