0

我有这段代码可以使用 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);
    }
}

但是现在,我还需要获取以前的值,但是我在这里我不知道该怎么办。

4

3 回答 3

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);
    }
于 2012-02-23T23:16:01.183 回答
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);
}
于 2012-02-24T00:33:43.947 回答
1

如果您只需要前一个值,为什么不在遍历集合时只保留每个“前一个”值。如果您需要更复杂的迭代器,请查看此 SO 帖子

于 2012-02-23T23:18:17.573 回答