ChatGPT解决这个技术问题 Extra ChatGPT

C# List<string> 到带分隔符的字符串

C# 中是否有一个函数可以快速将某些集合转换为字符串并使用分隔符分隔值?

例如:

List<string> names --> string names_together = "John, Anna, Monica"


D
Demodave

您可以使用 String.Join。如果您有 List<string>,那么您可以先调用 ToArray

List<string> names = new List<string>() { "John", "Anna", "Monica" };
var result = String.Join(", ", names.ToArray());

在 .NET 4 中,您不再需要 ToArray,因为 String.Join 的重载需要 IEnumerable<string>

结果:

约翰、安娜、莫妮卡


B
Bob

如果您愿意,也可以使用 linq 执行此操作

var names = new List<string>() { "John", "Anna", "Monica" };
var joinedNames = names.Aggregate((a, b) => a + ", " + b);

虽然我更喜欢 Quartermeister 答案中的非 linq 语法,但我认为 Aggregate 可能执行得更慢(可能更多的字符串连接操作)。


感谢您的快速回复,两者都工作正常。你说得对,我使用 Stopwatch 类做了一个小的性能测量,而 linq 方式要慢得多: String.Join(", ", names.ToArray()); --> 耗时 18 个刻度 Aggregate((a, b) => a + ", " + b) --> 耗时 736 个刻度
是的,我认为 Aggregate 更适合数学类型的运算。对于字符串,此操作类似于 for each ing,只是附加到一个效率非常低的字符串,因为您正在为列表中存在的每个项目创建一个新字符串。
请注意,如果容器为空,则没有种子值的聚合将引发 InvalidOperationException。使用种子版本 Aggregate(seed, func) 来避免错误处理代码或条件检查。 String.Join 不会抛出空,因此不需要种子或额外的代码......另外它不需要 Linq 并且语法更清晰一些。
如果您使用 StringBuilder,上面示例中的聚合可能会更快。不推荐使用 '+' 来执行多重连接。请参阅此处的备注部分 (msdn.microsoft.com/en-us/library/…)
我发现 StringBuilder.AppendJoin() 看起来正是 op 需要的:var names = new List<string>() { "John", "Anna", "Monica" }; string joinedNames = new StringBuilder().AppendJoin(", ", names); 它与 string.Join() 大致相同,我没有对此进行性能测试。如果您迫切需要一个没有聚合的 Linq 表单:var names = new List<string>() { "John", "Anna", "Monica" }; var joinedNames = new System.Text.StringBuilder(); names.ForEach(a => joinedNames.Append((joinedNames.Length > 0 ?", " : "") + a)); //joinedNames.ToString();