Как получить значения «Следующее» и «Предыдущее»?

У меня есть этот фрагмент кода для получения следующего значения с использованием пространства имен LINQ.

public static class Extension
{
    public static T Next<T>(this IEnumerable<T> source, Func<T, bool> predicate)
    {
        bool flag = false;

        using (var enumerator = source.GetEnumerator())
        {
            while (enumerator.MoveNext())
            {
                if (flag) return enumerator.Current;

                if(predicate(enumerator.Current))
                {
                    flag = true;
                }
            }
        }
        return default(T);
    }
}

Но теперь мне нужно получить еще и предыдущее значение, а я вот не знаю, что делать.


person Darf Zon    schedule 23.02.2012    source источник


Ответы (2)


Возможно, я что-то упускаю, но в чем причина прямого доступа к IEnumerable<T>.GetEnumerator(), IEnumerator<T>.MoveNext() и IEnumerator<T>.Current? Похоже, вы напрямую повторяете то, что делает цикл foreach.

public static T Next<T>(this IEnumerable<T> source, Func<T, bool> predicate)
{
    bool shouldReturn = false;
    foreach (var item in source)
    {
        if(shouldReturn)
            return item;

        if (predicate(item))
            shouldReturn = true;
    }
    return default(T);
}

public static T Previous<T>(this IEnumerable<T> source, Func<T, bool> predicate)
{
    var previous = default(T);
    foreach (var item in source)
    {
        if (predicate(item))
            return previous;
        previous = item;
    }
    return default(T);
}
person Lukazoid    schedule 24.02.2012

Если вам нужно только непосредственно предыдущее значение, почему бы просто не цепляться за каждое «предыдущее» при переборе коллекции. Если вам нужен более сложный итератор, посмотрите этот ТАК пост.

person Adam S    schedule 23.02.2012