如何解决C#尝试使用静态索引计数器创建自己的List
|| 我想制作自己的List
,它可以在foreach loop
中工作。除具有其他重要命令外,ѭ0还具有IndexOf(这是我唯一不喜欢List的东西,因为它是动态变化的)。我列表中的一个必须跟踪所有索引。以及Add
,Contains
,Count
,Remove
和[]
访问器(不知道如何执行此操作),因此现在Get
应该可以解决问题。
该列表应强制转换为一个名为Entity的基类,该基类因其相似性而在其他两个Npc / Player类之间共享。
无论如何,我也无法控制客户端,也正在为该服务器编写代码,但是协议规范要求所有玩家都必须跟踪索引,而无需进行常规List会对索引进行的任何剧烈动态更改。
我一直在遵循一个教程,如何使自己的Collections
下降到3个我无法解决的错误。
Argument 3: cannot convert from \'EntityList<T>\' to \'EntityList<Entity>\'
Cannot apply indexing with [] to an expression of type \'EntityList<Entity>\'
The best overloaded method match for \'EntityListEnumerator<T>.EntityListEnumerator(object[],System.Collections.Generic.HashSet<int>,EntityList<Entity>)\' has some invalid arguments
我也想问我这样做对吗?或看起来有些狡猾的东西。
感谢您的帮助,我非常感激.. C#的这一部分似乎非常先进并且很难理解。
来源到EntityList
public class EntityList<T> : ICollection<T> where T : Entity
{
private const int DEFAULT_CAPACITY = 1600,MIN_VALUE = 1;
public object[] entities;
public HashSet<int> indicies = new HashSet<int>();
public int curIndex = MIN_VALUE;
public int capacity;
public EntityList(int capacity) {
entities = new object[capacity];
this.capacity = capacity;
}
public EntityList()
: this(DEFAULT_CAPACITY) {}
public bool Add(T entity)
{
Add(entity,curIndex);
return true;
}
public void Add(T entity,int index) {
if (entities[curIndex] != null) {
increaseIndex();
Add(entity,curIndex);
} else {
entities[curIndex] = entity;
entity.setIndex(index);
indicies.Add(curIndex);
increaseIndex();
}
}
public T Get(int index)
{
return (T)entities[index];
}
public void Remove(T entity)
{
entities[entity.getIndex()] = null;
indicies.Remove(entity.getIndex());
decreaseIndex();
}
public T Remove(int index)
{
Object temp = entities[index];
entities[index] = null;
indicies.Remove(index);
decreaseIndex();
return (T)temp;
}
IEnumerator IEnumerable.GetEnumerator()
{
return new EntityListEnumerator<T>(entities,indicies,this);
}
private void increaseIndex() {
curIndex++;
if (curIndex >= capacity) {
curIndex = MIN_VALUE;
}
}
private void decreaseIndex()
{
curIndex--;
if (curIndex <= capacity)
curIndex = MIN_VALUE;
}
public int IndexOf(T entity) {
foreach(int index in indicies) {
if (entities[index].Equals(entity)) {
return index;
}
}
return -1;
}
public bool Contains(T entity)
{
return IndexOf(entity) > -1;
}
public int Count {
get
{
return indicies.Count();
}
}
}
EntityListEnumerator的源
class EntityListEnumerator<E> : IEnumerator<E> where E : Entity
{
private int[] indicies;
private object[] entities;
private EntityList<Entity> entityList;
protected int curIndex; //current index
protected E _current; //current enumerated object in the collection
public EntityListEnumerator(object[] entities,HashSet<int> indicies,EntityList<Entity> entityList)
{
this.entities = entities;
this.indicies = indicies.ToArray();
this.entityList = entityList;
curIndex = -1;
}
public virtual E Current
{
get
{
return _current;
}
}
public virtual bool MoveNext()
{
//make sure we are within the bounds of the collection
if (++curIndex >= entityList.Count)
{
//if not return false
return false;
}
else
{
//if we are,then set the current element
//to the next object in the collection
_current = entityList[indicies[curIndex]];
}
//return true
return true;
}
public void Remove() {
if (curIndex >= 1)
{
entityList.Remove(indicies[curIndex - 1]);
}
}
// Reset the enumerator
public virtual void Reset()
{
_current = default(E); //reset current object
curIndex = -1;
}
// Dispose method
public virtual void Dispose()
{
entityList = null;
_current = default(E);
curIndex = -1;
}
}
解决方法
我不是100%不确定您需要什么,但是您是否看过Dictionary对象?您可以定义自己的密钥,并使用通用版本保存所需的任何内容。
http://msdn.microsoft.com/en-us/library/xfhwa508.aspx
只需阅读您的最后评论:
您可以决定不使用列表的索引作为位置,而是使用我提到的字典或仅使用列表,而不是使用索引器(将“向上”的数字)来检查列表中的属性列表中的项目(列表中的项目拥有自己的\'index \',由您控制100%)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。