Как сделать класс повторяемым? - PullRequest
18 голосов
/ 26 февраля 2012

Это мой класс

public class csWordSimilarity
{
    public int irColumn1 = 0;
    public int irColumn2 = 0;
    public int irColumn3 = 0;
    public int irColumn4 = 0;
    public int irColumn5 = 0;
}

Я хочу сделать этот класс повторяемым для использования, как показано ниже

foreach (int irVal in myVarWordSimilarity)
{

} 

myVarWordSimilarity - это csWordSimilarity тип. Поэтому я хочу перебрать все публичные int переменные. Как мне нужно изменить класс csWordSimilarity, чтобы сделать его итеративным, как описано выше.

Ответы [ 2 ]

27 голосов
/ 26 февраля 2012

Вы можете реализовать IEnumerable и сделать так, чтобы переопределение GetEnumerator возвращало «итератор» над переменными с помощью оператора yield

class csWordSimilarity : IEnumerable<int>
{
    private int _var1 = 1;
    private int _var2 = 1;
    private int _var3 = 1;
    private int _var4 = 1;

    public IEnumerator<int> GetEnumerator()
    {
        yield return _var1;
        yield return _var2;
        yield return _var3;
        yield return _var4;
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}
9 голосов
/ 26 февраля 2012

Реализация IEnumerable.См. Использование итераторов (Руководство по программированию в C #)

В вашем случае вы можете просто использовать встроенный итератор List, например, так:

using System;
using System.Collections.Generic;

class csWordSimilarity : IEnumerable<int> {
    public int irColumn1 = 0;
    public int irColumn2 = 0;
    public int irColumn3 = 0;
    public int irColumn4 = 0;
    public int irColumn5 = 0;

    public IEnumerator<int> GetEnumerator() {
        return (new List<int>() { 
            irColumn1, irColumn2, irColumn3, irColumn4, irColumn5 
        }).GetEnumerator();
    }
    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {
        return GetEnumerator();
    }
}
...