【问题标题】:Enumerating through a list of gameobjects comparing against a group of Enums通过与一组枚举进行比较的游戏对象列表进行枚举
【发布时间】:2019-07-13 04:03:39
【问题描述】:

我希望找到一种紧凑的方法来使用 c# 内置的枚举功能完成以下操作 (在 Collections 库中)

1. 枚举一个游戏对象列表,在每次迭代中获取当前项目的名称

2. 将字符串名称与我为方便创建的一组枚举进行比较(以避免字符串中的拼写错误)

3.如果名称与至少一个枚举匹配,则返回 true 并执行内容

我在编写代码时经常看到IListIEnumerable之类的关键字,并希望更好地理解它们。

伪代码

foreach(GameObject item in myGameObjectList)
{
   if(item.name.ToLower() == nameof(IEnumerable<MyEnums>(out match /*does the string match?*/))
   {
     //this code will execute if the item in the list has a name matching atleast one of the enums
   }
}

【问题讨论】:

  • 既然可以比较枚举值本身,为什么还要比较字符串呢?只需将其存储在您的游戏对象上。数字比较比字符串比较快。
  • 原因是,这是为编辑器准备的,并不打算进行难以置信的优化,它旨在方便在构建之前进行配置,此代码在构建时从每个处理中剥离.将枚举添加到该事物正在比较的每个游戏对象可能很麻烦,与此相比,自动执行此操作的方式只会浪费精力。
  • 查看 Linq,它将为您提供一种方法来完成您的要求

标签: c# unity3d


【解决方案1】:

我首先将枚举列表作为一个数组。为了使代码看起来更好(但稍微慢一点),我们可以将该数组转换为一个列表,并为每个名称调用Contains。看这个例子:

 string[] names=System.Enum.GetNames(typeof(MessageType)); 
 List<string> namesList=new List<string>(names); // to be able to use contain

 foreach(GameObject item in myGameObjectList)
      if(namesList.Contains(item.name.ToLower())
          DoStuff();

在您的实际代码中,在开始时获取列表/名称数组,不要在每次调用时都这样做,因为它在后台使用反射,所以有点贵。

【讨论】:

    【解决方案2】:

    进一步我对使用Linq的评论

    string comparison = "YourEnum";
    List<GameObject> matches = objects.Where(x => x.name == comparison).ToList();
    

    以上示例中的matches 将是与您提供的枚举匹配的GameObjects,如果有任何匹配项,您可以执行您希望执行的操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-28
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 2017-08-07
      相关资源
      最近更新 更多