0

我想自己做List一个有能力的工作foreach loop。还有其他重要的命令List,比如 IndexOf (这是我唯一不喜欢 List 的地方,因为它是动态变化的)。我列表中的一个必须跟踪所有索引。以及Add, Contains, Count, Remove, 以及[]访问器(不知道如何做到这一点)所以现在Get应该可以解决问题。

List 应该被转换为一个名为 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# 的这一部分似乎非常先进且难以掌握概念。

实体列表的来源

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

}

4

1 回答 1

0

我不是 100% 确定你需要什么,但你看过 Dictionary 对象了吗?如果您使用通用版本,您可以定义自己的密钥并让它保存您需要的任何项目

http://msdn.microsoft.com/en-us/library/xfhwa508.aspx

只需阅读您的最后一条评论:您可以决定不使用列表的索引作为位置,而是使用我提到的字典或只使用列表,而不是使用索引器(将“搞砸”的数字)检查属性列表中的项目(让列表中的项目拥有自己的“索引”,您可以 100% 控制)

于 2011-06-21T19:48:02.040 回答