Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="BenchmarkDotNet" Version="0.13.1" />
<PackageReference Include="BenchmarkDotNet" Version="0.15.8" />
</ItemGroup>

<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,30 @@ namespace BenchmarkRunner
[Orderer(SummaryOrderPolicy.FastestToSlowest)]
public class ConcatenatorBenchmark
{
private readonly List<string> _firstList = Enumerable.Repeat("Code", 1_000_000).ToList();
private readonly List<string> _secondList = Enumerable.Repeat("Maze", 1_000_000).ToList();
[Params(50_000, 1_000_000)]
public int Size;

private List<string> _firstList = [];
private List<string> _secondList = [];
private readonly Concatenator _concatenator = new();


[GlobalSetup]
public void Setup()
{
_firstList = Enumerable.Range(0, Size).Select(i => $"Code{i}").ToList();
_secondList = Enumerable.Range(0, Size).Select(i => $"Maze{i}").ToList();
}

[Benchmark]
public void UsingAdd()
{
_concatenator.UsingAdd(_firstList, _secondList);
_concatenator.UsingAdd(_firstList, _secondList);
}

[Benchmark]
public void UsingAddNoCapacity()
{
_concatenator.UsingAddNoCapacity(_firstList, _secondList);
}

[Benchmark]
Expand All @@ -37,6 +53,12 @@ public void UsingAddRange()
_concatenator.UsingAddRange(_firstList, _secondList);
}

[Benchmark]
public void UsingAddRangeNoCapacity()
{
_concatenator.UsingAddRangeNoCapacity(_firstList, _secondList);
}

[Benchmark]
public void UsingCopyTo()
{
Expand All @@ -48,5 +70,11 @@ public void UsingSelectMany()
{
_concatenator.UsingSelectMany(_firstList, _secondList);
}

[Benchmark]
public void UsingCollectionExpression()
{
_concatenator.UsingCollectionExpression(_firstList, _secondList);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,24 @@ public class Concatenator
{
public List<string> UsingAdd(List<string> firstList, List<string> secondList)
{
var result = new List<string>(firstList.Count() + secondList.Count());
var result = new List<string>(firstList.Count + secondList.Count);

foreach (var item in firstList)
{
result.Add(item);
}

foreach (var item in secondList)
{
result.Add(item);
}

return result;
}

public List<string> UsingAddNoCapacity(List<string> firstList, List<string> secondList)
{
var result = new List<string>();

foreach (var item in firstList)
{
Expand All @@ -31,7 +48,17 @@ public List<string> UsingEnumerableUnion(List<string> firstList, List<string> se

public List<string> UsingAddRange(List<string> firstList, List<string> secondList)
{
var result = new List<string>(firstList.Count() + secondList.Count());
var result = new List<string>(firstList.Count + secondList.Count);

result.AddRange(firstList);
result.AddRange(secondList);

return result;
}

public List<string> UsingAddRangeNoCapacity(List<string> firstList, List<string> secondList)
{
var result = new List<string>();

result.AddRange(firstList);
result.AddRange(secondList);
Expand All @@ -41,19 +68,26 @@ public List<string> UsingAddRange(List<string> firstList, List<string> secondLis

public List<string> UsingCopyTo(List<string> firstList, List<string> secondList)
{
var combinedList = new string[firstList.Count() + secondList.Count()];
var combinedArray = new string[firstList.Count + secondList.Count];

firstList.CopyTo(combinedList);
secondList.CopyTo(combinedList, firstList.Count());
firstList.CopyTo(combinedArray, 0);
secondList.CopyTo(combinedArray, firstList.Count);

return combinedList.ToList();
return combinedArray.ToList();
}

public List<string> UsingSelectMany(List<string> firstList, List<string> secondList)
{
{
var combinedArray = new[] { firstList, secondList }.SelectMany(x => x);

return combinedArray.ToList();
}

public List<string> UsingCollectionExpression(List<string> firstList, List<string> secondList)
{
List<string> result = [.. firstList, .. secondList];

return result;
}
}
}
64 changes: 30 additions & 34 deletions collections-lists/ConcatenateLists/ConcatenateLists/Program.cs
Original file line number Diff line number Diff line change
@@ -1,46 +1,42 @@
namespace ConcatenateLists;
using ConcatenateLists;

public class Program
{
public static void Main()
{
Console.WriteLine("---------- Concatenate Lists in C# ----------");
Console.WriteLine("---------- Concatenate Lists in C# ----------");

var firstList = new List<string>() { "Code", "Maze", "Concatenate" };
var secondList = new List<string>() { "Lists", "in", "C#" };
var firstList = new List<string>() { "Code", "Maze", "Concatenate" };
var secondList = new List<string>() { "Lists", "in", "C#" };

var concatenator = new Concatenator();
var concatenator = new Concatenator();

Console.WriteLine();
Console.WriteLine("------ Concatenate lists using Add");
PrintOut(concatenator.UsingAdd(firstList, secondList));
Console.WriteLine();
Console.WriteLine("------ Concatenate lists using Add");
PrintOut(concatenator.UsingAdd(firstList, secondList));

Console.WriteLine();
Console.WriteLine("------ Concatenate using Enumerable.Concat");
PrintOut(concatenator.UsingEnumerableConcat(firstList, secondList));
Console.WriteLine();
Console.WriteLine("------ Concatenate using Enumerable.Concat");
PrintOut(concatenator.UsingEnumerableConcat(firstList, secondList));

Console.WriteLine();
Console.WriteLine("------ Concatenate using Enumerable.Union");
PrintOut(concatenator.UsingEnumerableUnion(firstList, secondList));
Console.WriteLine();
Console.WriteLine("------ Concatenate using Enumerable.Union");
PrintOut(concatenator.UsingEnumerableUnion(firstList, secondList));

Console.WriteLine();
Console.WriteLine("------ Concatenate using AddRange");
PrintOut(concatenator.UsingAddRange(firstList, secondList));
Console.WriteLine();
Console.WriteLine("------ Concatenate using AddRange");
PrintOut(concatenator.UsingAddRange(firstList, secondList));

Console.WriteLine();
Console.WriteLine("------ Concatenate using List CopyTo");
PrintOut(concatenator.UsingCopyTo(firstList, secondList));
Console.WriteLine();
Console.WriteLine("------ Concatenate using List CopyTo");
PrintOut(concatenator.UsingCopyTo(firstList, secondList));

Console.WriteLine();
Console.WriteLine("------ Concatenate using SelectMany");
PrintOut(concatenator.UsingSelectMany(firstList, secondList));
Console.WriteLine();
Console.WriteLine("------ Concatenate using SelectMany");
PrintOut(concatenator.UsingSelectMany(firstList, secondList));

Console.ReadLine();
}
Console.WriteLine();
Console.WriteLine("------ Concatenate using a collection expression");
PrintOut(concatenator.UsingCollectionExpression(firstList, secondList));

private static void PrintOut(List<string> list)
{
list.ForEach(x => Console.Write($" => {x}"));
Console.WriteLine();
}
static void PrintOut(List<string> list)
{
list.ForEach(x => Console.Write($" => {x}"));
Console.WriteLine();
}
49 changes: 42 additions & 7 deletions collections-lists/ConcatenateLists/Tests/Tests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,16 @@ public void GivenTwoLists_WhenUsingAddMethod_ThenReturnANewConcatenatedList()
{
var result = _concatenator.UsingAdd(_firstList, _secondList);

Assert.Equal(_expectedList.Count(), result.Count);
Assert.Equal(_expectedList.Count, result.Count);
Assert.Equal(_expectedList, result);
}

[Fact]
public void GivenTwoLists_WhenUsingAddNoCapacityMethod_ThenReturnANewConcatenatedList()
{
var result = _concatenator.UsingAddNoCapacity(_firstList, _secondList);

Assert.Equal(_expectedList.Count, result.Count);
Assert.Equal(_expectedList, result);
}

Expand All @@ -24,7 +33,7 @@ public void GivenTwoLists_WhenUsingEnumerableConcatMethod_ThenReturnANewConcaten
{
var result = _concatenator.UsingEnumerableConcat(_firstList, _secondList);

Assert.Equal(_expectedList.Count(), result.Count);
Assert.Equal(_expectedList.Count, result.Count);
Assert.Equal(_expectedList, result);
}

Expand All @@ -33,7 +42,7 @@ public void GivenTwoLists_WhenUsingEnumerableUnionMethod_ThenReturnANewConcatena
{
var result = _concatenator.UsingEnumerableUnion(_firstList, _secondList);

Assert.Equal(_expectedList.Count(), result.Count);
Assert.Equal(_expectedList.Count, result.Count);
Assert.Equal(_expectedList, result);
}

Expand All @@ -42,7 +51,16 @@ public void GivenTwoLists_WhenUsingAddRangeMethod_ThenReturnANewConcatenatedList
{
var result = _concatenator.UsingAddRange(_firstList, _secondList);

Assert.Equal(_expectedList.Count(), result.Count);
Assert.Equal(_expectedList.Count, result.Count);
Assert.Equal(_expectedList, result);
}

[Fact]
public void GivenTwoLists_WhenUsingAddRangeNoCapacityMethod_ThenReturnANewConcatenatedList()
{
var result = _concatenator.UsingAddRangeNoCapacity(_firstList, _secondList);

Assert.Equal(_expectedList.Count, result.Count);
Assert.Equal(_expectedList, result);
}

Expand All @@ -51,7 +69,7 @@ public void GivenTwoLists_WhenUsingCopyToMethod_ThenReturnANewConcatenatedList()
{
var result = _concatenator.UsingCopyTo(_firstList, _secondList);

Assert.Equal(_expectedList.Count(), result.Count);
Assert.Equal(_expectedList.Count, result.Count);
Assert.Equal(_expectedList, result);
}

Expand All @@ -60,8 +78,25 @@ public void GivenTwoLists_WhenUsingSelectManyMethod_ThenReturnANewConcatenatedLi
{
var result = _concatenator.UsingSelectMany(_firstList, _secondList);

Assert.Equal(_expectedList.Count(), result.Count);
Assert.Equal(_expectedList.Count, result.Count);
Assert.Equal(_expectedList, result);
}

[Fact]
public void GivenTwoLists_WhenUsingCollectionExpression_ThenReturnANewConcatenatedList()
{
var result = _concatenator.UsingCollectionExpression(_firstList, _secondList);

Assert.Equal(_expectedList.Count, result.Count);
Assert.Equal(_expectedList, result);
}

[Fact]
public void GivenListsWithDuplicates_WhenUsingEnumerableUnionMethod_ThenReturnEachValueOnce()
{
var result = _concatenator.UsingEnumerableUnion(new List<string> { "a", "a" }, new List<string> { "a" });

Assert.Equal(new List<string> { "a" }, result);
}
}
}
}
10 changes: 5 additions & 5 deletions collections-lists/ConcatenateLists/Tests/Tests.csproj
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>

<IsPackable>false</IsPackable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.1.0" />
<PackageReference Include="xunit" Version="2.4.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.10.1" />
<PackageReference Include="xunit" Version="2.9.3" />
<PackageReference Include="xunit.runner.visualstudio" Version="4.0.1">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="coverlet.collector" Version="3.1.2">
<PackageReference Include="coverlet.collector" Version="10.1.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
Expand Down
Loading