【问题标题】:Roslyn - creating a SeparatedList<T> from a yield'ed IEnumerable<T>Roslyn - 从 yield'ed IEnumerable<T> 创建一个分离列表<T>
【发布时间】:2013-07-24 09:22:51
【问题描述】:

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

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

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

(编辑:我应该补充一点,将functionParameterTypes 转换为List&lt;&gt; 并传递另一个List&lt;&gt;,其令牌比functionParameterTypes 中的元素少一个,但我正在尝试这样做而无需显式构建提前列出清单。)

【问题讨论】:

    标签: c# ienumerable roslyn


    【解决方案1】:

    separators 参数的 XML 文档说:

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

    你是对的,这不是该方法实际需要的:令牌的数量必须比节点的数量少一或与令牌的数量相同。如果这是故意的,我不会感到惊讶,如果您尝试处理刚刚编写的代码,像 f(foo, bar, ) 这样的代码是有意义的。

    我认为在这里对参数序列调用ToList() 是最好的选择。而且您不必使用另一个List 作为分隔符,您可以为此使用Enumerable.Repeat()。比如像这样(taken from a library I wrote where I faced the same issue):

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

    【讨论】:

      【解决方案2】:

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

              SyntaxFactory.SeparatedList<ParameterSyntax>(
                  functionParameterTypes
                      .SelectMany(param =>
                          new SyntaxNodeOrToken[]
                          {
                              param,
                              SyntaxFactory.Token(SyntaxKind.CommaToken)
                          })
                      .Take(functionParameterTypes.Count() * 2 - 1)
              );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-19
        • 2013-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-09
        • 1970-01-01
        相关资源
        最近更新 更多