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