Как получить следующие и предыдущие значения? - PullRequest
0 голосов
/ 24 февраля 2012

У меня есть этот кусок кода, чтобы получить следующее значение, используя пространство имен 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);
    }
}

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

Ответы [ 3 ]

2 голосов
/ 24 февраля 2012

Я могу что-то упустить здесь, но в чем причина прямого доступа к 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);
}
2 голосов
/ 24 февраля 2012
public static T Previous<T>(this IEnumerable<T> source, Func<T, bool> predicate)
    {       
        T t = default(T);
        using (var enumerator = source.GetEnumerator())
        {
            while (enumerator.MoveNext())
            {   
                if(predicate(enumerator.Current))
                {
                    return t;
                }
                t = enumerator.Current;
            }
        }
        return default(T);
    }
1 голос
/ 24 февраля 2012

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

...