0

Listで使える機能を自分で作りたいforeach loop。IndexOf のような他の重要なコマンドもListあります (リストは動的に変化するため、これだけが気に入らない点です)。私のリストにあるものは、すべてのインデックスを追跡する必要があります。AddContainsCountRemove、および[]アクセサ (これを行う方法がわからない) と同様に、今のGetところトリックを実行する必要があります。

List は、エンティティと呼ばれる基本クラスにキャストする必要があります。これは、類似性のために他の 2 つのクラス Npc / Player 間で共有されます。

とにかく、私はこのサーバーもコーディングしているクライアントを制御できませんが、プロトコル仕様では、すべてのプレーヤーが、通常のリストがインデックスに対して行う劇的な動的変更を行わずにインデックスを追跡する必要があります。

自分で作成する方法のチュートリアルに従っていますが、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;
}

}

4

1 に答える 1

0

何が必要なのか 100% わかりませんが、Dictionary オブジェクトを見ましたか? 独自のキーを定義し、汎用バージョンを使用する場合は必要なアイテムを保持できます

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

最後のコメントを読んでください:リストのインデックスを位置に使用せずに、私が言及した辞書を使用するか、単にリストを使用するかを決定できますが、インデクサー (「台無しにする」番号) を使用する代わりに、プロパティをチェックしますリスト内のアイテム (リスト内のアイテムに、100% コントロールする独自の「インデックス」を保持させます)

于 2011-06-21T19:48:02.040 に答える