gpt4 book ai didi

C#字符串操作问题

转载 作者:太空狗 更新时间:2023-10-29 22:29:31 25 4
gpt4 key购买 nike

这是一个简单的问题。我有一个应用程序需要一个电话号码,如“13335557777”,并且需要反转它并在每个号码之间插入一个点,如下所示:

“7.7.7.7.5.5.5.3.3.3.1。”

我知道我可以使用 StringBuilder 和 for 循环来反转字符串并插入点,但是在 LINQ(或其他方式)中是否有聪明的方法来做到这一点?

注意:为此,我并不真正关心性能或内存分配或其他任何东西,只是想看看这在 LINQ 中是如何完成的。

最佳答案

试试这个

var source = GetTheString();
var reversed = source.Reverse().Select(x => x.ToString()).Aggregate((x,y) => x + "." + y);

编辑

这个解决方案绝对是针对“聪明”的一端。使用 StringBuilder 构建字符串可能性能更高。该解决方案创建了许多中间字符串。

EDIT2

关于“聪明”解决方案与 StringBuilder 方法的相对速度存在一些争论。我编写了一个快速基准来衡量该方法。正如预期的那样,StringBuilder 更快。

  • 普通聚合(100 个元素):00:00:00.0418640
  • WithStringBuilder(100 个元素):00:00:00.0040099
  • 普通聚合(1000 个元素):00:00:00.3062040
  • WithStringBuilder(1000 个元素):00:00:00.0405955
  • 普通聚合(10000 个元素):00:00:03.0270392
  • WithStringBuilder(10000 个元素):00:00:00.4149977

但是,速度差异是否显着在很大程度上取决于它在您的应用程序中实际使用的位置。

基准代码。

public static class AggregateUnchanged {
public static string Run(string input) {
return input
.Reverse()
.Select(x => x.ToString())
.Aggregate((x, y) => x + "." + y);
}
}

public static class WithStringBuilder {
public static string Run(string input) {
var builder = new StringBuilder();
foreach (var cur in input.Reverse()) {
builder.Append(cur);
builder.Append('.');
}

if (builder.Length > 0) {
builder.Length = builder.Length - 1;
}

return builder.ToString();
}
}

class Program {
public static void RunAndPrint(string name, List<string> inputs, Func<string, string> worker) {

// Test case. JIT the code and verify it actually works
var test = worker("123456");
if (test != "6.5.4.3.2.1") {
throw new InvalidOperationException("Bad algorithm");
}

var watch = new Stopwatch();
watch.Start();
foreach (var cur in inputs) {
var result = worker(cur);
}
watch.Stop();
Console.WriteLine("{0} ({2} elements): {1}", name, watch.Elapsed, inputs.Count);
}

public static string NextInput(Random r) {
var len = r.Next(1, 1000);
var builder = new StringBuilder();
for (int i = 0; i < len; i++) {
builder.Append(r.Next(0, 9));
}
return builder.ToString();
}

public static void RunAll(List<string> input) {
RunAndPrint("Normal Aggregate", input, AggregateUnchanged.Run);
RunAndPrint("WithStringBuilder", input, WithStringBuilder.Run);
}

static void Main(string[] args) {
var random = new Random((int)DateTime.Now.Ticks);
RunAll(Enumerable.Range(0, 100).Select(_ => NextInput(random)).ToList());
RunAll(Enumerable.Range(0, 1000).Select(_ => NextInput(random)).ToList());
RunAll(Enumerable.Range(0, 10000).Select(_ => NextInput(random)).ToList());
}
}

关于C#字符串操作问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/679523/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com