c# – 两个包含接口的列表与一个包含带两个接口的结构的List
我有两个接口. ICacheHolder将由实现游戏对象和IVisualizer逻辑的类实现,该类将成为可视化表示.
public interface ICacheHolder { void updateCacheWithCurrentState(int chachFrame); void resizeCache(int newSize); T getCacheFrame<T>(int cacheIndex,float interpolationToNext) where T : struct; } public interface IVisualizer { void updateVisualization(ICacheHolder cacheHolder,int cacheIndex,float interpolation); } 每个ICacheHolder连接到一个IVisualizer对象,关系是1到1. 版本1: public class CacheFramework { private List<ICacheHolder> cacheHolders = new List<ICacheHolder>(); private List<IVisualizer> visualizers = new List<IVisualizer>(); ... } 版本2: struct SimulationObject { public ICacheHolder CacheHolder; public IVisualizer Visualizer; } public class CacheFramework { private List<SimulationObject> cacheHolder = new List<SimulationObject>(); ... } 添加和删??除等操作不会经常进行.只有在游戏开始时才会有很多添加电话. 版本1: private bool AddSimulationObject(ICacheHolder cacheHolder,IVisualizer visualizer) { if (!cacheHolders.Contains(cacheHolder) && !visualizers.Contains(visualizer)) { cacheHolders.Add(cacheHolder); visualizers.Add(visualizer); return true; } return false; } 版本2: private bool AddSimulationObject(ICacheHolder cacheHolder,IVisualizer visualizer) { int index = simulationObjects.FindIndex( delegate (SimulationObject simulationObject) { return simulationObject.CacheHolder == cacheHolder || simulationObject.Visualizer == visualizer; } ); if (index >= 0 ) { SimulationObject newObject; newObject.CacheHolder = cacheHolder; newObject.Visualizer = visualizer; return true; } return false; } 列表将至少被访问 附加信息: 编辑1: 修复了AddSimulationObject Version 2中的错误. 正如AddSimulationObject Version 2所指出的那样: private bool AddSimulationObject(ICacheHolder cacheHolder,IVisualizer visualizer) { SimulationObject newObject = new SimulationObject { CacheHolder = cacheHolder,Visualizer = visualizer }; if (simulationObjects.Contains(newObject)) { simulationObjects.Add(newObject); return true; } return false; } 但在这种情况下,我需要确保cacheHolder和visualizer不会出现在任何其他组合中. 编辑2: 我正在使用Unity3D,它主要支持.NET. 3.5 正如所指出的那样,使用比List更快查找的.NET集合可能更好.或者如果列表是可排序的,请使用List.BinarySearch. 编辑3: 我将使用struct版本.我不确定会有多少次查找.如果它成为一个问题,我可能会改为另一个.NET集合. 解决方法
我建议你使用struct方法,原因有两个:
>在.NET中,结构通用类型参数是专门处理的,并且是no boxing will occur. 因此,当涉及到是使用结构列表还是结构列表的问题时,我当然更喜欢使用结构列表,即使它导致一点性能下降.在你的情况下,我希望结构版本的列表表现更好,但我无法保证.您可以随时运行分析.但有一件事是肯定的:性能差异远小于AddSimulationObject中线性搜索的成本. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |