2017-10-05 2 views
1

J'ai cette boucle foreach où j'essaie de parcourir une liste documentTables de la classe Table qui contient des objets Table qui contiennent des objets de classe Row. Actuellement, j'obtiens une erreur indiquant: l'instruction foreach ne peut pas fonctionner sur les variables de type test1.Table car elle ne contient pas de définition publique pour GetEnumerator. Je ne comprends pas complètement ce qui se passe et je ne sais pas quel est le meilleur moyen d'implémenter l'interface.Implémentation de l'interface GetEnumerator

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

TABLEAU DE CLASSE (classe rangée à peu près la même, a quelques cordes et constructeur):

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

Si vous voulez une ligne, alors vous bouclez les lignes, pas les tables: _documentTables [i] .Rows; _ – Steve

+0

Vous devez afficher votre classe Table, implémente-t-elle 'IEnumerable ' ou simplement contenir une collection qui stocke les des rangées? Dans ce cas, utilisez cette propriété, f.e .: 'foreach (Ligne r dans documentTables [i] .Rows)' –

+0

Avez-vous l'implémentation de table et ligne sans qu'il soit difficile de deviner – duongthaiha

Répondre

1

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

Foreach répète un groupe d'instructions intégrées pour chaque élément dans un tableau ou une collection d'objets qui implémente l'interface IEnumerable ou IEnumerable.

Ainsi, votre table classe doit mettre en œuvre 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 { } 

Ensuite, vous pouvez faire:

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

Une autre application possible de votre classe de Table (plus flexible, je pense) est la suivante:

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

Maintenant, le nombre de lignes dans le constructeur n'est pas limité à trois.