Перейти к следующему элементу в списке - PullRequest
3 голосов
/ 18 ноября 2011

Если у меня есть список объектов, и я хочу переходить к следующему узлу при каждом вызове функции (т. Е. Создавать «GetNextNode», как мне это сделать? Сейчас у меня есть один метод, который получит первый узел моего списка и установите для него currentObj и верните его (оставив предыдущий узел по-прежнему равным нулю), флаг указывает, что мы больше не имеем дело с первым узлом в списке, затем я двигаюсь вперед и хочу перебрать список (используя foreach, я думаю?) на один узел за моим currentObj. Вот мой код:

 List<Employee> ListOfEmployees = new List<Employee>();
 Employee currEmployeeObj = null;
 Employee prevEmployeeObj = null;

 foreach (Employee employee in ListOfEmployees)
        {
           //how do i keep track of the previous and current employee in here?
        }

        return (currEmployeeObj); 
    }

Ответы [ 4 ]

7 голосов
/ 18 ноября 2011

Ненавижу звучать как динозавр, но так как вы все равно реализуете со списком, почему бы не повторить его с for вместо foreach? Целые числа действительно полезны для сравнений, таких как i == j + 1

4 голосов
/ 18 ноября 2011

Похоже, вы действительно заново изобретаете перечислитель:

public IEnumerator<Employee> GetEmployees()
{
    foreach (Employee employee in ListOfEmployees)
    {
        //custom processing here
        yield return employee;
    }
}

Использование:

var myEnumerator = foo.GetEmployees();
while(myEnumerator.MoveNext())
{
    var someEmployee = myEnumerator.Current;
    //do something
}

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

public class Foo
{
    List<Employee> ListOfEmployees = new List<Employee>();

    public Foo()
    {
        ListOfEmployees.Add(new Employee());
    }

    public IEnumerator<Employee> GetEmployees()
    {
        foreach (Employee employee in ListOfEmployees)
            yield return employee;
    }
}
2 голосов
/ 18 ноября 2011

(Как академическое упражнение, другие ответы, вероятно, более уместны здесь:)

Вы можете создать метод расширения, например, так:

public static IEnumerable<Tuple<T, T>> ToPairs<T>(this IEnumerable<T> enumerable)
    {
        using (var enumerator = enumerable.GetEnumerator())
        {
            if (enumerator.MoveNext())
            {
                var previous = enumerator.Current;
                while (enumerator.MoveNext())
                {
                    var current = enumerator.Current;
                    yield return new Tuple<T, T>(previous, current);
                    previous = current;
                }
            }
        }
    }

Чтобы вернуть вам кортеж, содержащий парыэлементов.

Который будет использоваться как:

foreach (var pair in ListOfEmployees.ToPairs())
{
   Employee prevEmployee = pair.Item1;
   Employee currEmployeeObj = pair.Item2;

}
0 голосов
/ 19 ноября 2011

http://msdn.microsoft.com/en-us/library/system.collections.ienumerator.aspx

Ссылка над этой строкой текста поможет решить мою проблему.

Спасибо всем за ответы и помощь!Голосовали те, кто пытался помочь и что-то предлагал

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...