如果我有一個IEnumerable像:成對迭代或滑動窗口枚舉
string[] items = new string[] { "a", "b", "c", "d" };
我想循環通所有的對連續項(滑動大小爲2的窗口)的。這將是
("a","b"), ("b", "c"), ("c", "d")
我的解決辦法是這樣的
public static IEnumerable<Pair<T, T>> Pairs(IEnumerable<T> enumerable) {
IEnumerator<T> e = enumerable.GetEnumerator(); e.MoveNext();
T current = e.Current;
while (e.MoveNext()) {
T next = e.Current;
yield return new Pair<T, T>(current, next);
current = next;
}
}
// used like this :
foreach (Pair<String,String> pair in IterTools<String>.Pairs(items)) {
System.Out.PrintLine("{0}, {1}", pair.First, pair.Second)
}
當我寫了這個代碼,我如果有已經在.NET框架,做同樣的事情功能不知道,做它不只是對於任何大小的元組而言。 恕我直言,應該有一個很好的方式來做這種滑動窗口操作。我使用C#2.0,我可以想象用C#3.0(w/LINQ)有更多(更好)的方法來做到這一點,但我主要對C#2.0解決方案感興趣。不過,我也會欣賞C#3.0解決方案。
這似乎可以與Jon Skeet的`SmartEnumerator`共享很多實現,它告訴你一個項目是否是列表中的最後一個。 http://msmvps.com/blogs/jon_skeet/archive/2007/07/27/smart-enumerations.aspx – 2010-08-02 18:30:13
作爲參考,這個函數在F#中被稱爲'窗口':http://stackoverflow.com/questions/8874901/is-the-an-equivalent-to-f-seq-windowed-in-c – Benjol 2014-12-12 06:17:27