Enumerable.Intersperse的扩展方法?

我从Haskell学到了散布函数 ,并一直在寻找c#中的实现。

Intersperse有2个参数,一个IEnumerable 源和一个T元素。 它返回一个IEnumerable,其中元素插入源的每个元素之间。

一种可能的用例是在整数列表之间放置一个任意整数,例如:

// returns: {1, 0, 2, 0, 3} (List() {1, 2, 3}).Intersperse(0); 

这是string.Join(…)的一般情况。

其他人错过的东西:如果你只想在它们之间,而不是在前面或后面,你需要做一个额外的检查:

 public static IEnumerable Intersperse(this IEnumerable source, T element) { bool first = true; foreach (T value in source) { if (!first) yield return element; yield return value; first = false; } } 

我本着Linq解决方案的精神编写了一个懒惰的解决方案! 我想出的其他解决方案涉及在返回数据之前遍历整个列表,然后返回结果列表。

其他一些答案在循环的每次迭代中都有if检查。

 public static IEnumerable Intersperse(this IEnumerable source, T element) { using (var enumerator = source.GetEnumerator()) { if (enumerator.MoveNext()) { yield return enumerator.Current; while (enumerator.MoveNext()) { yield return element; yield return enumerator.Current; } } } } 

写起来很容易:

 public static IEnumerable Intersperse(this IEnumerable source, T value) { bool first = true; foreach(T item in source) { if(first) { first = false; } else { yield return value; } yield return item; } } 

如果你想知道如何实现它,我会这样做:

 public static IEnumerable Intersperse(this IEnumerable collection, T value) { foreach(T item in collection) { yield return item; yield return value; } yield break; }