2011-06-21 9 views
0

foreach loopで機能する自分自身をListにしたいと考えています。同様に他の重要なコマンドを持っていると、ListはIndexOf(これは動的に変化しているので私がListについて気に入らない唯一のものです)を持っています。私のリストの1つは、すべてのインデックスを追跡する必要があります。同様にAdd,Contains,Count,Remove[]アクセサー(これを行う方法はわかりません)のように、Getはこのトリックを行う必要があります。C#静的インデックスカウンタを使用して独自のリストを作成しようとしています

リストは、類似性のために2つの他のクラスNpc/Playerの間で共有されるEntityという基本クラスにキャストする必要があります。

とにかく私はこのサーバーもコーディングしていますが、プロトコルの指定では、すべてのプレーヤーがインデックスを追跡する必要があります。

私は自分の作り方をチュートリアルに従いました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 

また、私はこの権利をやっているお聞きしたいのですが?または何かがドギーに見える。

私はそれを感謝してくれてありがとう..この部分は非常に高度でコンセプトをつかむのは難しいようです。

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

}

+0

私は尋ねても申し訳ありませんが、なぜですか? –

+0

なぜですか?なぜ私はこれをやろうとしているのですか?まあ、それは長期的にはより柔軟になるだろう、私はあなたがそれがあまりにも多くを心配する必要はありませんが正常に機能することを知っているので、ボンネットの下に車でエンジンを隠すようなものだと思う。このクラスがなくても、NPC/Playerの両方に2つのインデックスキーパーがあるので、コードを再利用しているようです。 Mehなぜか分かりませんが、私はあなたが何が間違っているか知っていれば教えてくれてありがとうございます。私はCで何かをする方法を学ぶ初心者です# – SSpoke

+0

なぜあなたは単にListを使わなかったのですか?よくリストのインデックスは動的です..私はそれらを静的にしたい..それについて要約する。 500番目のインデックスのプレーヤーがログアウトしたとします。すべてのプレイヤーが500を超えると、インデックスの順番がずれてしまいます。最初のプレーヤーがログオフすれば地獄になります。誰もがnpcsと同じです。 – SSpoke

答えて

0

私はあなたが必要なものを100%わからないんだけど、あなたは、Dictionaryオブジェクトを見たのですか? リストの位置のインデックスが、いずれかの使用を使用しないように決めることができました:あなたは、一般的なバージョンを使用する場合には、ちょうどあなたの最後のコメントを読んで

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

独自のキーを定義し、それはあなたが必要なものは何でもアイテム保持することができますリスト内の項目のプロパティをチェックするインデクサー(「ねじ込み」する数字)を使用する代わりに(リスト内の項目には独自の「インデックス」がありますコントロール100%)

+0

私自身のキーを定義することはできません。通常のリストではキーが増分しなければならないポイントです。キーの再利用も実装する必要があります(利用可能な最も低いキーを使用して)私はすべてのロジックを隠そうとしている以上何をしようとしているので、非常に乱雑に見えません。 – SSpoke

関連する問題