2

SeparatedList動的に生成されIEnumerableたシーケンス (Enumerable.Select()関数呼び出しによって構築される)を使用して を構築しようとしています。を作成する API 関数は、 anと anSeparatedListの 2 つのパラメータを取ります。簡単な関数 を用意しました。これは、この場合は要求された数のカンマを生成する無限シーケンス ジェネレータです。IEnumerable<T>IEnumerable<SyntaxToken>Repeat

このSeparatedList関数は、2 番目のシーケンスにエントリがあるのと同じ数の最初のシーケンス (ここではパラメーターの型) を消費しているように見えます。関数がどのように機能するかを誤解していて、他の誰かがこれを行ったことがありますか? ありがとう

Syntax.SeparatedList<ParameterSyntax>(
    functionParameterTypes,Repeat(i=>Syntax.Token(SyntaxKind.CommaToken)))

functionParameterTypes(編集: をaに変換し、要素よりも 1 つ少ないトークンでList<>別のものを渡すことを追加する必要がありますが、事前にリストを明示的に構築する必要なくこれを実行しようとしています。)List<>functionParameterTypes

4

2 に答える 2

0

separatorsパラメータの XML ドキュメントには、次のように記載されています。

トークンの数は、ノードの数より 1 つ少なくする必要があります。

これはメソッドが実際に必要とするものではないことは間違いありません。トークンの数は、ノードの数より 1 少ないか、トークンの数と同じでなければなりません。これが意図的なものであったとしても驚かないf(foo, bar, )でしょう。作成中のコードを処理しようとしている場合、コードのようなものは理にかなっています。

ToList()ここでは、一連のパラメーターを呼び出すのが最良の選択だと思います。Listまた、セパレーターに別のものを使用する必要はありませんEnumerable.Repeat()。そのために使用できます。たとえば、次のようになります(同じ問題に直面した場所で私が書いたライブラリから取得しました):

public static SeparatedSyntaxList<T> ToSeparatedList<T>(
    this IEnumerable<T> nodes, SyntaxKind separator = SyntaxKind.CommaToken)
    where T : SyntaxNode
{
    var nodesList = nodes == null ? new List<T>() : nodes.ToList();
    return Syntax.SeparatedList(
        nodesList,
        Enumerable.Repeat(
            Syntax.Token(separator), Math.Max(nodesList .Count - 1, 0)));
}
于 2013-07-24T20:06:37.247 に答える