2012-11-07 24 views
1

我得到了這個很好的方法,我在很多情況下使用。我的擴展方法是否有內置的.NET Framework替代品?

internal static IEnumerable<TResult> RoundTrip<TSource, TResult> 
(this IEnumerable<TSource> e, Func<TSource, TSource, TResult> currentNextAction) 
{ 
    using (IEnumerator<TSource> enumer = e.GetEnumerator()) 
    { 
     if (!enumer.MoveNext()) 
      yield break; 

     bool flag = true; 
     TSource first = enumer.Current; 

     do 
     { 
      TSource current = enumer.Current; 
      TSource next = (flag = enumer.MoveNext()) ? enumer.Current : first; 
      yield return currentNextAction(current, next); 
     } while (flag); 
    } 
} 

我已經看過MSDN一些內置的替代品,但無法找到他們。有沒有?

而且,有什麼我可以改進的代碼?

編輯:非enumeratorable法新代碼。

internal static IEnumerable<TResult> RoundTrip<TSource, TResult> 
(this IEnumerable<TSource> e, Func<TSource, TSource, TResult> currentNextAction) 
{ 
    bool flag = false; 
    TSource first = default(TSource); 
    TSource previous = default(TSource); 

    foreach (TSource item in e) 
    { 
     if (!flag) 
     { 
      flag = true; 
      first = previous = item; 
      continue; 
     } 

     yield return currentNextAction(item, previous); 
     previous = item; 
    } 

    if (flag) 
     yield return currentNextAction(previous, first); 
    else 
     yield break; 
} 

(我喜歡的方式,第一個)

+1

您可能想解釋它做了什麼。 'RoundTrip()'不是最具描述性的名字... – BoltClock

+4

你有沒有具體的問題?否則,你可能想問一下['codereview.stackexchange.com'](http://codereview.stackexchange.com/)。 –

+1

是代碼的預期行爲,因爲它代表將迭代ienumeraqble並進一步返回第一個元素作爲第一個元素和最後一個元素,然後停止。然而從名字上來看,它聽起來有點像一個「環形緩衝區」,你希望在達到結尾後再次開始枚舉...... –

回答

1

沒有什麼建爲,但你真的可以把它簡化:

var lst = e.ToList(); 

lst.Add(lst[0]); 
var result = lst.Take(lst.Count - 1).Select((x, i) => action(x, lst[i + 1])); 
1

你有Enumerable.Zip

var result = e.Zip(e.Skip(1).Concat(e.Take(1)), action) 

它當然會枚舉序列兩次(+1元),除非你做一個列表第一

編輯:錯過了往返

相關問題