IEnumerable <T> в C#

Целый оператор переключения находится в том же объеме. Для обхождения его сделайте это:

switch (val)
{
    case VAL:
    {
        // This **will** work
        int newVal = 42;
    }
    break;

    case ANOTHER_VAL:
      ...
    break;
}

Примечание скобки.

8
задан Lasse V. Karlsen 23 July 2009 в 21:53
поделиться

4 ответа

Ну, первая ошибка компилятора, которую я получаю, это то, что он жалуется, что:

Использование универсального типа 'System.Collections.Generic.IEnumerator' требует аргументов типа '1'

Это находится в строке 16, вот этот:

IEnumerator IEnumerable.GetEnumerator()

Исправляем это путем добавления директивы using для пространства имен System.Collections (совет: поместите курсор сразу после IEnumerator на r в конец слова и нажмите Ctrl +. (Ctrl + точка), он должен предложить вам добавить директиву «using System.Collections;», сделайте это).

Затем он компилируется и запускается. Соответствует ли это тому, что вы ожидаете?

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

24
ответ дан 5 December 2019 в 04:52
поделиться

Не знаете, почему вы получаете ошибки, но разве это не было бы проще?

public static class NumbersSequence
{
    public static IEnumerable<int> Naturals
    {
        get 
        {
            for (int i = 1; i <= 1000; i++)
                yield return i;
        }
    }
}

class Program
{
    public static void Main(string[] args)
    {
        foreach (int i in NumbersSequence.Naturals)
            Console.WriteLine(i);
    }
}
9
ответ дан 5 December 2019 в 04:52
поделиться

Слегка не по теме, но, возможно, интересно увидеть этот подход:

public static class NumbersSequence
{
    public static IEnumerable<int> Naturals
    {
        get 
        {
            int i = 0;
            while(true)
                yield return i++;
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        foreach (int i in NumbersSequence.Naturals.Take(1000))
            Console.WriteLine(i);
    }
}

C # 3.0 afaik. Обратите внимание на кажущийся бесконечным цикл в геттере и вызов Take (1000). С помощью этого метода у вас теперь есть «бесконечная» последовательность натуральных чисел (бесконечная до максимального значения int). Он не застрянет, пока вы скажете ему взять определенную сумму.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Большая часть кода заимствована из ответа Эрвикера.

4
ответ дан 5 December 2019 в 04:52
поделиться

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

  1. Enumerable.Range ()
  2. Найдите время, чтобы подумать об этой реализации:

.

public class NaturalNumbersSequence : IEnumerable<int>
{
    public IEnumerator<int> GetEnumerator()
    {
        for (int i=0 i <= int.MaxValue;i++)
            yield return i;
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        for (int i=0 i <= int.MaxValue;i++)
            yield return i;
    }
}

class Program
{
    static void Main(string[] args)
    {
        foreach (int i in new NaturalNumbersSequence().TakeWhile(i => i<=1000) )
            Console.WriteLine(i);
    }
}
2
ответ дан 5 December 2019 в 04:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: