我有一个静态列表:
public static List<IMachines>mList =new List<IMachines>();
列表中包含两种不同类型的对象(机器):
IMachines machine = new AC();
IMachines machine = new Generator();
如果在列表中添加项目后,我想通过其name属性搜索特定的机器,然后在使用foreach循环进行遍历后如果在列表中找到该项目...我该怎么知道该项目是AC
类型还是Generator
类型?
答案 0 :(得分:5)
答案 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)
使用is
和as
运营商。
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 {}