Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 设计此解决方案的更合适方法是什么?_C#_Linq - Fatal编程技术网

C# 设计此解决方案的更合适方法是什么?

C# 设计此解决方案的更合适方法是什么?,c#,linq,C#,Linq,我目前正在处理一些有效的代码。真的要归结到我是否应该做这些?瞎了?演员 我有一门课: public abstract class Trigger { // no logic, just three automatic properties } 继承人: // there are several classes like this that store different things like strings, // int,floats, enums, etc,etc. public c

我目前正在处理一些有效的代码。真的要归结到我是否应该做这些?瞎了?演员

我有一门课:

public abstract class Trigger
{
  // no logic, just three automatic properties
}
继承人:

// there are several classes like this that store different things like strings,
// int,floats, enums, etc,etc.
public class ActivateOnTimeDelay : Trigger
{
   // More automatic properties and possibly fields.
}
然后我将这些类放入
列表中

在另一个类中,以相反的for循环迭代列表

if (currentMission.ActiveTriggers.Count > 0)
{
  for (int i = currentMission.ActiveTriggers.Count - 1; i >= 0; i--)
  {
   ActivateOnDeathDelay activateOnDeathD = currentMission.ActiveTriggers[i] as    ActivateOnDeathDelay;
   ActivateOnDeathImmediate activateOnDeathI = currentMission.ActiveTriggers[i] as ActivateOnDeathImmediate;
   ActivateOnFinishDelay activateOnFinishD = currentMission.ActiveTriggers[i] as ActivateOnFinishDelay;
   ActivateOnFinishImmediate activateOnFinishI = currentMission.ActiveTriggers[i] as ActivateOnFinishImmediate;
   ActivateOnFinishMass activateOnFinishM = currentMission.ActiveTriggers[i] as ActivateOnFinishMass;
   ActivateOnTimeDelay activateOnTimeD = currentMission.ActiveTriggers[i] as ActivateOnTimeDelay;
   ActivateOnTimeImmediate activateOnTimeI = currentMission.ActiveTriggers[i] as ActivateOnTimeImmediate;

   DisplayDialog displayDialog = currentMission.ActiveTriggers[i] as DisplayDialog;
   SpawnEnemy spawnEnemy = currentMission.ActiveTriggers[i] as SpawnEnemy;

   if (activateOnDeathD != null)
   {
     // do logic
   }

   // more null checks for each possible item that may be created this loop pass.

当使用触发器时,它将从列表中删除,并且它的ID被放入一些触发器监视的
HashSet
UsedTriggers中。

一般来说,这里应该发生的是
触发器
(或者可能是
ITrigger
接口)公开每个具体类型的触发器适当实现的抽象方法。这样你就不需要演员,你只需要做一些

for (int i = currentMission.ActiveTriggers.Count - 1; i >= 0; i--)
{
    // Run() is an abstract method on Trigger
    currentMission.ActiveTriggers[i].Run();
}
或者,使用LINQ(改进的可读性)可能更好:

foreach (var trigger in currentMission.ActiveTriggers.Reverse())
{
    trigger.Run();
}