如何获得下一个和上一个值?

时间:2012-02-23 23:05:58

标签: linq ienumerable linq-to-objects ienumerator

我已经有了这段代码来使用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 个答案:

答案 0 :(得分:2)

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 :(得分: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);
}

答案 2 :(得分:1)

如果您只需要前一个值,为什么不在迭代整个集合时挂起每个“previous”。如果您需要更复杂的迭代器,请查看this SO post