2012-02-23 2 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을 확인하십시오.

관련 문제