2012-02-23 4 views
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); 
    } 
} 

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

ответ

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
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

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

 Смежные вопросы

  • Нет связанных вопросов^_^