Коллекция с Next () - PullRequest
       25

Коллекция с Next ()

2 голосов
/ 11 октября 2011

Как я могу получить следующий элемент элемента, на который у меня есть ссылка в некоторой коллекции, например, List<T>?

Я не говорю о каких-либо циклах и т. Д. Я хочу получить только один следующий (или предыдущий)элемент

Ответы [ 3 ]

8 голосов
/ 11 октября 2011

В коллекции нет понятия «текущий элемент». Итераторы / Перечислители делают. И у них есть MoveNext() метод. И тогда вы можете получить доступ к текущему элементу этого перечислителя с помощью Current.

Вы можете позвонить GetEnumerator() почти во все коллекции, чтобы получить перечислитель.

Одна проблема с перечислителями состоит в том, что вы обычно не можете ни копировать их, ни перемещать их назад. (В отличие от C ++, где большинство коллекций имеют более мощные итераторы)

2 голосов
/ 11 октября 2011

Это не самый производительный, но он должен работать.Вы даже можете сделать это методом расширения.

    public static T GetNext<T>(IList<T> collection, T value )
    {
        int nextIndex = collection.IndexOf(value) + 1;
        if (nextIndex < collection.Count)
        {
            return collection[nextIndex];
        }
        else
        {
            return value; //Or throw an exception
        }
    }

И вы используете его так:

        var list = new List<string> {"A", "B", "C", "D"};
        string current = "B";
        string next = GetNext(list, current);
        Console.WriteLine(next); //Prints C
1 голос
/ 11 октября 2011

Чтобы получить «следующий», вам нужно понятие «текущий». C # не использует итераторы, как C ++, вы можете получить перечислитель:

        var enumerator = x.GetEnumerator();

        while (enumerator.MoveNext())
        {
            Console.WriteLine(enumerator.Current);
        }

Но было бы проще просто использовать индексатор int в List<T>

...