foreach在列表中的用法[c#]
本文关键字:用法 列表 foreach | 更新日期: 2023-09-27 18:03:59
MonoBehavior[] list; // This is from Unity3d but think of it as Object,
// all classes inherit from it.
列表中有很多东西,有些是Alpha,来自Alpha类,还有一些来自其他类。
foreach(Alpha a in list) // Alpha is a script.
a.doSomething();
我假设我的foreach将以这种方式工作:foreach Alpha脚本在列表中找到做某事,忽略所有其他组件。
我想这是选角的问题。请帮助我更好地理解类型转换/多态性。
我在执行过程中得到这个错误:不能从源类型强制转换为目标类型
您正在以错误的方式处理多态性:虽然Alpha是派生类型,但并非MonoBehavior类型列表中的所有其他对象都是派生类型。因此,有些将无法执行foreach所执行的隐式类型强制转换。您可以使用"OfType()"扩展名,如果它在您的环境中可用:
foreach(Alpha a in list.OfType<Alpha>())
您可以尝试这样做:
foreach(Alpha a in list.Where(x => x is Alpha)) // Alpha is a script.
a.doSomething();
这就是我要做的,我知道它肯定会在Unity3d中编译。顺便说一下,OfType不在Unity中,TypeOf是,但作为taras。roshko说使用is
更好。
MonoBehavior[] list;
foreach(MonoBehavior current in list) // Search the whole list for MonoBehaviors.
if (current is Alpha) // Check if current is an Alpha type.
current.doSomething(); // current is a valid Alpha type script.
foreach
将尝试转换列表中的所有元素,因为Alpha是MonoBehavior,但MonoBehavior不是Alpha,您无法正确运行它。检查current是否为Alpha,如果是,可以随意使用
使用OfType只遍历指定类型的元素
如果您希望循环只操作Alpha
类型,则需要重写如下:
foreach (var item in list)
{
if (item is Alpha)
{
((Alpha) item).doSomething();
}
}
编辑:Maarten的回答使用了更简洁的LINQ,所以我推荐使用LINQ。
您的foreach
语句将尝试将那里的每个对象转换为Alpha
。如果它们有一个共同的父类,你可以使用它,否则使用Object
类
如果你的list包含基本类型的list并且你只是取每个元素并试图认为它是Alpha类型那么尝试使用below
是非法的foreach(Unity3d a in list) // Alpha is a script.
a.doSomething();
假设在Unity3d中定义了doSomething()