Hãy thử điều này
var source = GetTheString();
var reversed = source.Reverse().Select(x => x.ToString()).Aggregate((x,y) => x + "." + y);
EDIT
Giải pháp này chắc chắn là nhằm vào "thông minh" kết thúc. Nó có khả năng thực hiện nhiều hơn để sử dụng một StringBuilder để xây dựng chuỗi. Giải pháp này tạo ra nhiều chuỗi trung gian.
EDIT2
Có một số cuộc tranh luận về tốc độ tương đối của các giải pháp "thông minh" so với các phương pháp StringBuilder. Tôi đã viết một chuẩn mực nhanh để đo lường cách tiếp cận. Theo dự kiến, StringBuilder nhanh hơn.
- Bình thường tổng hợp (100 phần tử): 00: 00: 00,0418640
- WithStringBuilder (100 phần tử): 00: 00: 00,0040099
- Bình thường tổng hợp (1000 phần tử): 00: 00: 00,3062040
- WithStringBuilder (1000 phần tử): 00: 00: 00,0405955
- Bình thường tổng hợp (10000 phần tử): 00: 00: 03,0270392
- WithStringBuilder (10000 phần tử): 00: 00: 00,4149977
Tuy nhiên, có hay không chênh lệch tốc độ là dấu hiệu phụ thuộc nhiều vào nơi nó thực sự được sử dụng trong ứng dụng của bạn.
Mã cho điểm chuẩn.
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());
}
}
Bạn có thực sự muốn một dấu chấm sau 1 cuối cùng không? Nếu vậy, nó hơi thay đổi vấn đề. –
Vâng, điều đó không rõ ràng. Nó không thực sự quan trọng, tôi sẽ đưa ra các giải pháp làm theo cách này. –