using System.Diagnostics;
public string GivenName { get; set; }
public string MiddleName { get; set; }
public string FamilyName { get; set; }
public string NameUsingAggregate =>
new[] { GivenName, MiddleName, FamilyName }
.Where(name => !string.IsNullOrWhiteSpace(name))
.Aggregate("", (current, name) => current + " " + name).Trim();
public string NameUsingStringJoin
return string.Join(" ", new[] { GivenName, MiddleName, FamilyName }.Where(name => !string.IsNullOrWhiteSpace(name)));
public string NameUsingStringConcat =>
string.Concat(new[] { GivenName, MiddleName, FamilyName }
.Where(name => !string.IsNullOrWhiteSpace(name))
.Select(name => name + " ")).Trim();
const int iterations = 1000000;
var stopwatch = Stopwatch.StartNew();
var initialMemory = GC.GetTotalMemory(true);
for (int i = 0; i < iterations; i++)
var name = person.NameUsingAggregate;
var finalMemory = GC.GetTotalMemory(true);
var elapsedTimeMethod1 = stopwatch.ElapsedMilliseconds;
var memoryUsedMethod1 = finalMemory - initialMemory;
initialMemory = GC.GetTotalMemory(true);
for (int i = 0; i < iterations; i++)
var name = person.NameUsingStringJoin;
finalMemory = GC.GetTotalMemory(true);
var elapsedTimeMethod2 = stopwatch.ElapsedMilliseconds;
var memoryUsedMethod2 = finalMemory - initialMemory;
initialMemory = GC.GetTotalMemory(true);
for (int i = 0; i < iterations; i++)
var name = person.NameUsingStringConcat;
finalMemory = GC.GetTotalMemory(true);
var elapsedTimeMethod3 = stopwatch.ElapsedMilliseconds;
var memoryUsedMethod3 = finalMemory - initialMemory;
Console.WriteLine($"Method 1 (Aggregate): Time = {elapsedTimeMethod1} ms, Memory = {memoryUsedMethod1} bytes");
Console.WriteLine($"Method 2 (string.Join): Time = {elapsedTimeMethod2} ms, Memory = {memoryUsedMethod2} bytes");
Console.WriteLine($"Method 3 (string.Concat): Time = {elapsedTimeMethod3} ms, Memory = {memoryUsedMethod3} bytes");