【问题标题】:Using Linq to concatenate a list of property of classes [duplicate]使用 Linq 连接类的属性列表 [重复]
【发布时间】:2015-04-26 11:58:54
【问题描述】:

我见过这个问题 (Using LINQ to concatenate strings),它适用于字符串,但是如果我想连接一个字符串列表,其中字符串是类的属性,会发生什么?

该问题中提出的方法不起作用(我已经尝试过)。

给定一个数组或人,我想要一个包含他们名字串联的字符串。

x => person.Name

我该如何解决这个问题?

【问题讨论】:

  • 使用.Select(x => x.Name)string.Join
  • 按照与您链接的问题相同的方式进行操作,当前和下一个是 Person 对象而不是字符串。
  • @CraigW.:它不起作用我已经尝试过了。我会毫不费力地禁止任何投反对票的人。
  • @Daniel A. White,Servy:我会因为缺乏努力而禁止你们俩。问题没有重复。从建议的解决方案中可以看出。
  • @Revious,在寻求帮助时威胁禁令并不是讨好自己的最佳方式。您可能会考虑提供“不起作用(我尝试过)”之外的一些细节,因为在不知道您实际编写的代码和遇到的错误的情况下,诊断问题和提出解决方案会有些困难。

标签: c# linq


【解决方案1】:

这将为您完成工作:

var res = yourList.Select(x => x.Name).Aggregate((current, next) => current + ", " + next);

但是,我建议你使用String.Join(string separator, IEnumerable<string> values)

var res = String.Join(", ", yourList.Select(x => x.Name));

更多详情:

在这种情况下说实话,您可以使用AggregateString.Join()。如果我们测试两个查询的执行时间,我们会发现第二个比第一个快。但原因不是Aggregate() 函数;问题是我们在一个循环中连接字符串。这将生成大量中间字符串,导致性能不佳。你可以使用StringBuilder.Append,如果你还想使用Aggregate并提高性能:

 var res = yourList.Select(x => x.Name)
                   .Aggregate(new StringBuilder(), (current, next) => current.Append(next).Append(", ")).ToString();

String.Join() 已经在内部使用了StringBuilder,因此它将是最佳选择。

【讨论】:

  • 使用Aggregate 对包含大量项目的集合会产生不好的性能。
  • @MarcinJuraszek 同意。所以,我向 OP String.Join 展示了第二个选项。
【解决方案2】:

如果是LINQ to Objects,你应该使用String.Join:

var result = String.Join(",", data.Select(x => x.MyProperty));

【讨论】:

    猜你喜欢
    • 2012-02-10
    • 1970-01-01
    • 2018-11-03
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-06
    相关资源
    最近更新 更多