c# – 两个包含接口的列表与一个包含带两个接口的结构的List

c# – 两个包含接口的列表与一个包含带两个接口的结构的List,第1张

概述我有两个接口. ICacheHolder将由实现游戏对象和IVisualizer逻辑的类实现,该类将成为可视化表示. public interface ICacheHolder{ void updateCacheWithCurrentState(int chachFrame); void resizeCache(int newSize); T getCacheFram 我有两个接口. 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.
我正在尝试确定它是否更好(性能/内存方面)将它们存储在两个单独的列表中或作为结构存储在一个列表中.会有很大的不同吗?如果我使用struct版本会发生拳击吗?我重新调整列表的大小将从100到1000.

版本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;}

列表将至少被访问
每一帧都通过它的索引.

附加信息:
使用ICacheHolder的每个类都将包含List< struct>与位置,旋转或健康等数据.每个列表元素都将是一个快照.目标是来回穿越时间.

编辑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中线性搜索的成本.

总结

以上是内存溢出为你收集整理的c# – 两个包含接口的列表与一个包含带两个接口的结构的List全部内容,希望文章能够帮你解决c# – 两个包含接口的列表与一个包含带两个接口的结构的List所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1244884.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存