2017-10-05 32 views
1

Rowクラスオブジェクトを含むTableオブジェクトを含むTableクラスのdocumentTablesリストを調べようとしている、このforeachループがあります。現在、私はエラーが発生しています:GetEnumeratorのパブリック定義が含まれていないため、foreach文は変数test1.Tableを操作できません。私は、何が起こっているのか、インターフェイスを実装するための最良の方法は何かを完全に理解していません。GetEnumeratorインターフェイスの実装

class Table { 
public Row a; 
public Row b; 
public Row c; 

public Table (Row _a,Row _b,Row _c) 
{ 
a=_a; 
b=_b; 
c=_c; 

} 
} 
+0

テーブルをオーバーライドしないで行をループする場合は、_documentTables [i] .Rows; _ – Steve

+0

テーブルクラスを表示するか、IEnumerable を実装するか、行?その場合は、そのプロパティを使用してください:foreach(row r in documentTables [i] .Rows) ' –

+0

'テーブル 'の実装方法を示してください。 – duongthaiha

答えて

1

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/foreach-in

foreach文は、各 用の組み込みステートメントのグループを繰り返し:

for (int i = 0; i < documentTables.Count(); i++) 
{ 
    foreach (Row r in documentTables[i]) 
    { 
     // some functionality here 
    } 
} 

テーブルクラス(行クラスはほとんど同じ、いくつかの文字列やコンストラクタを持っています)要素、または IEnumerableまたはIEnumerableインターフェイスを実装するオブジェクトコレクションのいずれかです。

class Table: IEnumerable 
{ 
    public Row a; 
    public Row b; 
    public Row c; 

    public Table(Row _a, Row _b, Row _c) 
    { 
     a = _a; 
     b = _b; 
     c = _c; 

    } 

    public IEnumerator GetEnumerator() 
    { 
     yield return a; 
     yield return b; 
     yield return c; 
    } 
} 


public class Row { } 

次に、あなたが行うことができます:だからあなたのクラスはIEnumerableをを実装する必要があり

var myTable = new Table(new Row(), new Row(), new Row()); 
foreach (var row in myTable) 
{ 
    // some functionality here 
} 

(より柔軟なあなたのテーブルクラスの別の可能な実装で、私は考えてください)は次のとおりです:

class Table: IEnumerable 
{ 
    private Row[] _rows; 

    public Table(params Row[] rows) 
    { 
     this._rows = rows; 

    } 

    public IEnumerator GetEnumerator() 
    { 
     foreach (var row in _rows) 
     { 
      yield return row; 
     } 
    } 
} 

コンストラクタの行数は3に限定されません。