Вопрос

Я опускаю эту строку после посещения разных веб-сайтов, чтобы попытаться понять пример использования пользовательского перечисления в реальном времени.У меня есть примеры.Но они приводят меня в замешательство.

Пример

Возьмите 1

class NumberArray
{
    public int[] scores;

    public NumberArray()
    {
    }

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

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

}

Возьмите 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);
    }
}

Главная

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

В дубле 2 я следовал пользовательской итерации, чтобы повторить тот же массив целых чисел, что и в дубле 1.Почему я должен это делать ходите вокруг да около, чтобы повторить целое число, используя пользовательскую итерацию?

Вероятно, я упустил из виду пользовательская итерация в реальном времени нужда.Можете ли вы объяснить мне задачу, которую я не могу выполнить с помощью существующего средства итерации?(Я только что закончил учебу, так что приведите мне простой пример, чтобы я мог понять это правильно).

Обновить : Я взял эти примеры с какого-то сайта.В этом коде нет ничего особенного, мы можем добиться этого очень просто, даже не используя пользовательскую итерацию, мне было интересно узнать реальный сценарий, в котором пользовательская итерация весьма удобна.

Это было полезно?

Решение

Пользовательские итераторы полезны, когда ресурсы, которые вы повторяете, не загружены предварительно в память, а скорее получены по мере необходимости на каждой итерации.Например, в LINQ to SQL, когда вы делаете что-то вроде:

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

на каждом этапе foreach в цикле выполняется запрос к таблице Employees в базе данных для получения следующей записи.Таким образом, если вы выйдете из цикла раньше, вы прочитаете не всю таблицу целиком, а только те записи, которые вам нужны.

Смотрите здесь реальный пример: перечисление строк в файле.Здесь каждая строка считывается из файла на каждой итерации foreach петля.(в качестве дополнительного примечания, .NET Framework 4 предлагает такую же встроенную функциональность).

Другие советы

Честно говоря, я не совсем уверен, о чем вы спрашиваете, но если вас беспокоит разница между возвратом массива (как в take 1) и возвратом итератора (take 2), вот мой ответ.

Существует большая разница между возвратом массива и возвратом итератора.Возврат массива означает возврат внутреннего состояния (если только вы не делаете копию как часть возврата, но это дорого).Если вы возвращаете итератор, вы просто возвращаете абстракцию, которая позволит вызывающим выполнять итерацию состояния.Это также означает, что вы можете выполнять отложенную оценку, если вам нужно (чего вы, очевидно, не можете сделать, если возвращаете массив).

Кроме того, с поддержкой итераторов в C # 2 на самом деле нет причин реализовывать IEnumerable вручную.Пожалуйста, ознакомьтесь с этим вопросом для получения дополнительной информации Может ли кто-нибудь демистифицировать ключевое слово yield?

Точно так же, как другим примером, где пользовательская итерация была полезна мне в прошлом, было предоставление общей абстракции для рекурсивного перечисления всех узлов в древовидной структуре...

foreach (Node n in tree)
  //...do something
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top