2

一種のリスト コンテナー (たとえば、変更できない MyList) がありますが、宣言されているのは GetCount() および At() メソッドのみです。

MyListにforeach文を使いたいので、以下のような拡張メソッドを書きました。

public static class MyListHelper
{
    public static IEnumerable<MyListItemType> GetEnumerator(this MyList list)
    {
        for (int i = 0; i < list.GetCount(); ++i )
        {
            yield return list.At(i);
        }
    }
}

しかし、' foreach (MyListItemType i in list)... ' をコーディングすると、コンパイラは 'MyList に GetEnumerator の piblic 定義が含まれていません' と吐き出します。

GetEnumerator() メソッドを直接呼び出すことができ、問題なく動作します。

そのためにはもっと何をすればいいですか?

4

3 に答える 3

3

MyList(非静的) クラスのコードを直接編集できない場合は、おそらく拡張メソッドToIEnumerableなどを作成する必要があります。たぶん次のようなもの:

public static class MyListExtensions
{
  public static IEnumerable<MyListItemType> ToIEnumerable(this MyList list)
  {
    return new Wrapper(list)
  }

  private class Wrapper : IEnumerable<MyListItemType>
  {
    readonly MyList list;

    public Wrapper(MyList list)
    {
      this.list = list;
    }

    public IEnumerator<MyListItemType> GetEnumerator() 
    { 
      for (int i = 0; i < list.GetCount(); ++i )
      { 
        yield return list.At(i); 
      } 
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
      return this.GetEnumerator();
    }
  } 
}
于 2012-09-19T07:56:46.717 に答える
2

IEnumerableまたはインターフェイスMyListを実装するように変更します。これにはGetEnumeratorが含まれます。IEnumerable<T>

于 2012-09-19T07:54:29.327 に答える
1

インターフェイスMyListを実装する必要がありますIEnumerable

public class MyList:IEnumerable<MyListItemType>
{
    public IEnumerable<MyListItemType> GetEnumerator()
    {
        ...
    }
}
于 2012-09-19T07:57:07.350 に答える