こんにちは私は、これを適切に行う方法を完全に混乱させる構文上の問題を抱えています。C#IEnumeratorを使用して汎用リストコレクションを作成する方法
マイカスタムリスト出典:GetEnmerator()と警告の多くに
エラーや警告がある(エラーのある):「インターフェイスメンバを実装していません
エラー1 'EntityListEnumerator' System.Collections.IEnumerator 。現在'。 'EntityListEnumerator.Current'は 'System.Collections.IEnumerator.Current'を実装できません。これは、一致する戻り値の型が 'object'ではないためです。
警告2 'EntityList.Add(T)は継承メンバ' System.Collections.Generic.List.Add(T) 'を非表示にします。隠れが意図されていた場合は、新しいキーワードを使用してください。
警告3 'EntityList.this [int]'は、継承メンバー 'System.Collections.Generic.List.this [int]'を非表示にします。隠れが意図されていた場合は、新しいキーワードを使用してください。
警告4 'EntityList.Remove(T)'は、継承メンバー 'System.Collections.Generic.List.Remove(T)'を非表示にします。隠れが意図されていた場合は、新しいキーワードを使用してください。
警告5 'EntityList.IndexOf(T)'は、継承メンバー 'System.Collections.Generic.List.IndexOf(T)'を非表示にします。隠れが意図されていた場合は、新しいキーワードを使用してください。
警告6 'EntityList.Contains(T)'は、継承メンバー 'System.Collections.Generic.List.Contains(T)'を非表示にします。隠れが意図されていた場合は、新しいキーワードを使用してください。
警告7 'EntityList.Count'は、継承メンバー 'System.Collections.Generic.List.Count'を非表示にします。隠れが意図されていた場合は、新しいキーワードを使用してください。ここで
class EntityList<T> : List<T>, IEnumerable<T> where T : Entity
{
private const int DEFAULT_CAPACITY = 1600, MIN_VALUE = 1;
public T[] entities;
public HashSet<int> indicies = new HashSet<int>();
public int curIndex = MIN_VALUE;
public int capacity;
public EntityList(int capacity) {
entities = new T[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 this[int index]
{
get
{
return entities[index];
}
set
{
entities[index] = value;
}
}
public void Remove(T entity)
{
entities[entity.getIndex()] = null;
indicies.Remove(entity.getIndex());
decreaseIndex();
}
public Entity Remove(int index)
{
Object temp = entities[index];
entities[index] = null;
indicies.Remove(index);
decreaseIndex();
return (Entity)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<T> : IEnumerator<T> where T : Entity
{
private int[] indicies;
private object[] entities;
private EntityList<T> entityList;
protected int curIndex; //current index
protected T _current; //current enumerated object in the collection
public EntityListEnumerator(object[] entities, HashSet<int> indicies, EntityList<T> entityList)
{
this.entities = entities;
this.indicies = indicies.ToArray();
this.entityList = entityList;
curIndex = -1;
}
public virtual T 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(T); //reset current object
curIndex = -1;
}
// Dispose method
public virtual void Dispose()
{
entityList = null;
_current = default(T);
curIndex = -1;
}
}
ジェネリックT型に主に私の本当のタイプといくつかのボクシングの会話をmとします。
class EntityListEnumerator<T> : IEnumerator<T> where T : Entity
{
//....
object IEnumerator.Current
{
get { return Current; }
}
//....
}
また、あなたのリストのクラスがリスト<を継承しているので、彼らは仮想ではありませんので、>あなたがリスト<>のメソッドをオーバーライドすることはできません:ありがとう
私はIListの代わりにICollectionを使う必要があると思ったが、残っているインターフェースメンバーを実装することはできなかった。そのコードスニペットはどのようなフォーマットですか.. C#ファイル形式のようには見えませんが、私は以下のコードを想定しています。ドル記号= < >、ああ、私はEntityListと$ type $をEntityで置き換えたと思いますか? – SSpoke
@SSpokeこのスニペットをVS2010にインポートすることができます:Tools/Code Snippets Manager/Import ...これを使用するには、単に 'collection'とintellisenseと入力するだけでこのコードスニペットを挿入することをお勧めします。私はあなたがコピーすることができますスケルトンクラスを挿入:http://pastebin.com/EMyYFC4A –
これはGoogleのこのようなものを見つけることはできませんコレクションの非常に素晴らしく簡単な実装ですすべてのお手伝いをありがとう。 – SSpoke