GetEnumerator接口实现

时间:2017-10-05 10:11:09

标签: c# foreach interface enumerator

我有这个foreach循环,我正在尝试浏览Table类的documentTables列表,其中包含包含Row类对象的Table对象。目前我收到一个错误说:foreach语句不能对变量类型test1.Table进行操作,因为它不包含GetEnumerator的公共定义。我不完全理解发生了什么,不知道什么是实现接口的最佳方式。

publishing {
    publications {
        mavenJava(MavenPublication) {
            from components.java

            artifact sourceJar {
                classifier "sources"
            }
        }
    }
}

TABLE CLASS(行类几乎相同,有很少的字符串和构造函数):

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

1 个答案:

答案 0 :(得分:1)

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

  

foreach语句为每个语句重复一组嵌入式语句   数组中的元素或实现的数组   IEnumerableIEnumerable界面。

所以你的 Table 类需要实现 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 { }

然后你可以这样做:

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

您的Table类的另一种可能的实现(我认为更灵活)如下:

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

现在构造函数中的行数不限于三个。