2

我正在尝试SeparatedList使用动态生成的IEnumerable序列(由Enumerable.Select()函数调用构造)来构建一个。创建 a 的 API 函数SeparatedList有两个参数, anIEnumerable<T>和 an IEnumerable<SyntaxToken>。我提供了一个简单的函数 ,Repeat它是一个无限序列生成器,在这种情况下,它可以根据要求生成尽可能多的逗号。

SeparatedList函数似乎消耗了与第二个序列中的条目一样多的第一个序列(此处的参数类型),这让我很困惑。我是否误解了该功能应该如何工作并且有其他人这样做过?谢谢

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

(编辑:我应该补充一点,将 a 转换functionParameterTypes为 a并使用比 in 元素少一个令牌List<>传递另一个确实有效,但我试图这样做而不必提前明确构建列表。)List<>functionParameterTypes

4

2 回答 2

0

separators参数的 XML 文档说:

令牌数必须比节点数少一。

没错,这不是该方法实际需要的:令牌的数量必须比节点的数量少一或与令牌的数量相同。如果这是故意的,我不会感到惊讶,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 回答
0

我也同样需要SeparatedList使用动态生成的参数列表来创建一个。我的解决方案是使用SelectMany()并向Take()参数添加分隔符(即“逗号”),然后删除最后一个尾随逗号。

        SyntaxFactory.SeparatedList<ParameterSyntax>(
            functionParameterTypes
                .SelectMany(param =>
                    new SyntaxNodeOrToken[]
                    {
                        param,
                        SyntaxFactory.Token(SyntaxKind.CommaToken)
                    })
                .Take(functionParameterTypes.Count() * 2 - 1)
        );
于 2018-02-09T21:36:30.877 回答