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