Pergunta

Eu estou largando esta linha depois de ter visitado sites diferentes para tentar entender o exemplo em tempo real de usar enumeração personalizada. Eu tenho exemplos. Mas eles me levar a confusão.

Exemplo

Tome 1

class NumberArray
{
    public int[] scores;

    public NumberArray()
    {
    }

    public NumberArray(int[] scores)
    {
        this.scores = scores;
    }

    public int[] Scores
    {
        get {return scores;}
    }

}

Take 2

public class Enumerator : IEnumerator
{
    int[] scores;
    int cur;
    public Enumerator(int[] scores)
    {
        this.scores = scores;
        cur = -1;
    }
    public Object Current
    {
        get {
            return scores[cur];
        }
    }

    public void Reset()
    {
        cur = -1;
    }

    public bool MoveNext()
    {
        cur++;
        if (cur < scores.Length)
            return true;
        else return false;
    }
}

public class Enumerable : IEnumerable
{
    int[] numbers;

    public void GetNumbersForEnumeration(int[] values)
    {
        numbers = values;
        for (int i = 0; i < values.Length; i++)
            numbers[i] = values[i];
    }

    public IEnumerator GetEnumerator()
    {
        return new Enumerator(numbers);
    }
}

Principal

static void Main()
{
    int[] arr = new int[] { 1, 2, 3, 4, 5 };
    NumberArray num = new NumberArray(arr);
    foreach(int val in num.Scores)
    {
        Console.WriteLine(val);
    }

    Enumerable en = new Enumerable();
    en.GetNumbersForEnumeration(arr);

    foreach (int i in en)
    {
        Console.WriteLine(i);
    }
    Console.ReadKey(true);
}

Em take 2, eu segui a iteração personalizada para iterate a mesma matriz de inteiros como eu fiz no tomar 1. Por que eu deveria rodeios para iterar um inteiro usando personalizado iteração ?

Provavelmente eu perdi o costume em tempo real iteração necessidade. Você pode me explicar a tarefa que eu não posso fazer com facilidade iteração existente? ( Acabei de terminar meus estudos, então me dar um exemplo simples, para que eu possa compreendê-lo corretamente ).

Update: eu levei esses exemplos de algum site. Não há nada de especial em que o código, podemos alcançá-lo de maneira muito simples, mesmo sem o uso de iteração costume, o meu interesse era conhecer o cenário real onde costume iteração é bastante útil.

Foi útil?

Solução

iterators

personalizadas são úteis quando os recursos que estão a iteração não são pré-carregados na memória, mas sim obtido conforme necessário em cada iteração. Por exemplo, em LINQ to SQL, quando você faz algo como:

foreach(var employee in dataContext.Employees) {
    // Process employee
}

em cada etapa do ciclo foreach, a tabela Funcionários no banco de dados é consultado para obter o próximo registro. Dessa forma, se você sair do loop cedo, você não ler a tabela inteira, mas apenas os registros que você necessário.

Veja aqui um exemplo do mundo real: Enumerar linhas em um arquivo . Aqui, cada linha é lida a partir do arquivo em cada iteração do loop foreach. (Tal como uma nota de lado, Framework 4 ofertas esta mesma funcionalidade incorporada).

Outras dicas

Para ser honesto, eu não sou inteiramente certo o que você está pedindo, mas se você está preocupado com a diferença entre retornando um array (como em take 1) e retornando um iterador (take 2), aqui está a minha resposta .

Há uma grande diferença entre retornando um array e retornando um iterador. Retornando um meio de matriz retornam estado interno (a menos que você faça uma cópia como parte do retorno, mas que é caro). Se você retornar um iterador, você acabou de voltar de uma abstração, que irá permitir que os chamadores estado iterate. Isto significa também, que você pode fazer avaliação preguiçosa, se você precisa (algo que, obviamente, não pode fazer se você estiver retornando um array).

Além disso, com o apoio para iteradores em C # 2, não há realmente nenhuma razão para implementar IEnumerable com a mão. Por favor, veja esta questão para o detalhe adicional alguém pode desmistificar a palavra-chave yield?

Assim como outro exemplo onde iteração costume tem sido útil para mim no passado foi o de fornecer uma abstração comum para recursivamente enumerar todos os nós em uma estrutura de árvore ...

foreach (Node n in tree)
  //...do something
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top