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

ここで何かが欠けているかもしれませんがIEnumerable<T>.GetEnumerator()、直接アクセスする理由は何ですか? ループの動作を直接複製しているようです。IEnumerator<T>.MoveNext()IEnumerator<T>.Currentforeach

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 に答える
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 に答える
1

直前の値のみが必要な場合は、コレクションを繰り返し処理するときに、それぞれの「前の」値に固執しないでください。より複雑なイテレータが必要な場合は、この SO 投稿を確認してください。

于 2012-02-23T23:18:17.573 に答える