11

私はHaskellから散在関数を学び、c#での実装を探していました。

Intersperseは、IEnumerable<T>ソースとT要素の2つの引数を取ります。ソースのすべての要素の間に要素が挿入されたIEnumerableを返します。

考えられるユースケースの1つは、整数のリストの間に任意の整数を配置することです。次に例を示します。

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

これはstring.Join(...)の一般的なケースです。

4

6 に答える 6

14

他の人が見逃していること:アイテムの間にだけ置き、前や後ろにも入れたくない場合は、追加のチェックを行う必要があります。

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

また

public static IEnumerable<T> Intersperse<T>(this IEnumerable<T> source, T element)
{
    var e = source.GetEnumerator(); 
    bool b = e.MoveNext();
    if (b) yield return e.Current;

    while (e.MoveNext())
    {
        yield return element;
        yield return e.Current;
    }
}           
于 2009-04-15T19:32:08.820 に答える
5

Linqソリューションの精神に基づいて、怠惰なソリューションをコーディングしました。私が思いついた他の解決策は、データを返す前にリスト全体をトラバースし、結果のリストを返すことでした。

他の回答のいくつかには、ループのすべての反復でifチェックがあります。

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;
            }
        }
    }
}
于 2009-04-15T19:32:18.680 に答える
2

書くのはとても簡単でしょう:

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;
    }
}
于 2009-04-15T19:32:33.937 に答える
-3

それを実装する方法がわからない場合は、次のようにします。

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

    yield break;
}
于 2009-04-15T19:31:46.730 に答える