Udvidelsesmetode for Enumerable.Intersperse?

Udvidelsesmetode for Enumerable.Intersperse?

Noget de andre er gået glip af:hvis du kun vil have det imellem varer, og ikke også foran eller bagved, skal du lave et ekstra tjek:

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

Jeg har kodet en løsning, der er doven, i Linq-løsningernes ånd! Andre løsninger, jeg fandt på, involverede at krydse hele listen, før jeg returnerede data, og derefter returnere den resulterende liste.

Nogle af de andre svar har et if-tjek på hver iteration af loopet.

public static IEnumerable<T> Intersperse<T>(this IEnumerable<T> 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;
            }
        }
    }
}

Det ville være ret nemt at skrive:

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