5

時々、最後のアイテムを除いて、各アイテムの後に新しいアイテムを挿入してリストを処理する必要があることに気付きます。文字列のリストの各項目の間にコンマを入れる方法と似ています。

毎回最後(または最初)のアイテムの特殊なケースをコーディングすることにうんざりしていたので、Linqスタイルの拡張機能でパターンをキャプチャしました。

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

        yield return item;
    }
}

たとえば、これにより、フロードキュメントをプログラムで簡単にハイパーリンクで埋めることができますが、各ハイパーリンクの間に改行が入ります。

para.Inlines.AddRange(_recentFiles.Select(f => f.ToHyperlink())
                                  .Separate(() => new LineBreak()));

これがSystem.Linq.Enumerable(このようなものを書いた直後に私が通常発見するもの)にまだ存在しないと仮定すると、問題は、Separate他の機能フレームワークまたは言語で通常呼び出されるリストでのこの操作は何ですか?

4

5 に答える 5

14

Haskell:intersperse

Zip通常、別の操作を意味します(zip [a, b, c] [x, y, z] = [(a, x), (b, y), (c, z)]

于 2009-07-21T11:24:03.190 に答える
2

しばしば参加と呼ばれます。

于 2009-07-21T11:23:57.590 に答える
1

これはstring.Join()に少し似ていますが、Joinは実際のリストを返しません。

于 2009-07-21T11:24:03.520 に答える
1

Clojureではinterposeとも呼ばれます。

user> (interpose "," ["a" "b" "c"])
("a" "," "b" "," "c")
于 2009-07-26T19:18:17.810 に答える
0

長辺にデータがあり、もう一方にセパレーターがあるジッパー(英国-zip)を作成しているように聞こえます:-)

于 2009-07-21T11:20:34.790 に答える