集合列表具有多种类型的用户定义对象?

时间:2012-05-23 13:54:20

标签: c# c#-4.0 interface

我有一个静态列表:

public static List<IMachines>mList =new List<IMachines>();

列表中包含两种不同类型的对象(机器):

IMachines machine = new AC();
IMachines machine = new Generator();

如果在列表中添加项目后,我想通过其name属性搜索特定的机器,然后在使用foreach循环进行遍历后如果在列表中找到该项目...我该怎么知道该项目是AC类型还是Generator类型?

6 个答案:

答案 0 :(得分:5)

您可以使用is operator

  

检查对象是否与给定类型兼容

例如:

if(item is AC)
{
  // it is AC
}

答案 1 :(得分:3)

    interface IVehicle {

    }

    class Car : IVehicle
    {

    }

    class Bicycle : IVehicle
    {

    }

    static void Main(string[] args)
    {
        var v1 = new Car();
        var v2 = new Bicycle();

        var list = new List<IVehicle>();
        list.Add(v1);
        list.Add(v2);

        foreach (var v in list)
        {
            Console.WriteLine(v.GetType());
        }

    }

答案 2 :(得分:2)

使用“是”运算符。

List<IMachines> list = new List<IMachines>();
list.Add(new AC());
list.Add(new Generator());
foreach(IMachines o in list)
{
  if (o is Ingredient)
  {
    //do sth
  }
  else if (o is Drink)
  {
    //do sth
  }
}

答案 3 :(得分:1)

您还可以使用OfType()方法仅返回指定类型的项目:

IEnumerable<Generator> generators = mList.OfType<Generator>();

答案 4 :(得分:0)

使用isas运营商。

        List<IMachines> mList =new List<IMachines>();
        IMachines machine = mList.Where(x => x.Name == "MachineName").FirstOrDefault();

        if (machine != null)
        {
            if (machine is Generator)
            {
                Generator generator = machine as Generator;
                //do something with generator
            }
            else if (machine is AC)
            {
                AC ac = machine as AC;
                //do something with ac
            }
            else
            {
                //do you other kinds? if no, this is never going to happen
                throw new Exception("Unsupported machine type!!!");
            }

        }

答案 5 :(得分:0)

如果您想根据类型执行不同的操作,可以使用GroupBy type

通过这样做,您可以获得与每个派生类型相对应的子列表。

以下是代码段

    void Main()
    {
        List<IMachines> mList = new List<IMachines>();

        mList.Add(new AC());
        mList.Add(new Generator());
        mList.Add(new AC());
        mList.Add(new Generator());
        mList.Add(new Generator());
        mList.Add(new Generator());

        var differentIMachines = mList.GroupBy(t=>t.GetType());
        foreach(var grouping in differentIMachines)
        {
                Console.WriteLine("Type - {0}, Count - {1}", grouping.Key, grouping.Count());

                foreach(var item in grouping)
                {
                //iterate each item for particular type here
                }
        }

    }

    interface IMachines {   }

    class AC : IMachines {}

    class Generator : IMachines {}