diff --git a/collections-lists/ConcatenateLists/BenchmarkRunner/BenchmarkRunner.csproj b/collections-lists/ConcatenateLists/BenchmarkRunner/BenchmarkRunner.csproj
index 2ea5b608b0..bea7f628bb 100644
--- a/collections-lists/ConcatenateLists/BenchmarkRunner/BenchmarkRunner.csproj
+++ b/collections-lists/ConcatenateLists/BenchmarkRunner/BenchmarkRunner.csproj
@@ -2,13 +2,13 @@
Exe
- net6.0
+ net10.0
enable
enable
-
+
diff --git a/collections-lists/ConcatenateLists/BenchmarkRunner/ConcatenatorBenchmark.cs b/collections-lists/ConcatenateLists/BenchmarkRunner/ConcatenatorBenchmark.cs
index 1d5a1552de..65f5bd41ba 100644
--- a/collections-lists/ConcatenateLists/BenchmarkRunner/ConcatenatorBenchmark.cs
+++ b/collections-lists/ConcatenateLists/BenchmarkRunner/ConcatenatorBenchmark.cs
@@ -9,14 +9,30 @@ namespace BenchmarkRunner
[Orderer(SummaryOrderPolicy.FastestToSlowest)]
public class ConcatenatorBenchmark
{
- private readonly List _firstList = Enumerable.Repeat("Code", 1_000_000).ToList();
- private readonly List _secondList = Enumerable.Repeat("Maze", 1_000_000).ToList();
+ [Params(50_000, 1_000_000)]
+ public int Size;
+
+ private List _firstList = [];
+ private List _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]
@@ -37,6 +53,12 @@ public void UsingAddRange()
_concatenator.UsingAddRange(_firstList, _secondList);
}
+ [Benchmark]
+ public void UsingAddRangeNoCapacity()
+ {
+ _concatenator.UsingAddRangeNoCapacity(_firstList, _secondList);
+ }
+
[Benchmark]
public void UsingCopyTo()
{
@@ -48,5 +70,11 @@ public void UsingSelectMany()
{
_concatenator.UsingSelectMany(_firstList, _secondList);
}
+
+ [Benchmark]
+ public void UsingCollectionExpression()
+ {
+ _concatenator.UsingCollectionExpression(_firstList, _secondList);
+ }
}
}
diff --git a/collections-lists/ConcatenateLists/ConcatenateLists/ConcatenateLists.csproj b/collections-lists/ConcatenateLists/ConcatenateLists/ConcatenateLists.csproj
index 74abf5c976..dfb40caafc 100644
--- a/collections-lists/ConcatenateLists/ConcatenateLists/ConcatenateLists.csproj
+++ b/collections-lists/ConcatenateLists/ConcatenateLists/ConcatenateLists.csproj
@@ -2,7 +2,7 @@
Exe
- net6.0
+ net10.0
enable
enable
diff --git a/collections-lists/ConcatenateLists/ConcatenateLists/Concatenator.cs b/collections-lists/ConcatenateLists/ConcatenateLists/Concatenator.cs
index dd505c0412..56399d6f73 100644
--- a/collections-lists/ConcatenateLists/ConcatenateLists/Concatenator.cs
+++ b/collections-lists/ConcatenateLists/ConcatenateLists/Concatenator.cs
@@ -4,7 +4,24 @@ public class Concatenator
{
public List UsingAdd(List firstList, List secondList)
{
- var result = new List(firstList.Count() + secondList.Count());
+ var result = new List(firstList.Count + secondList.Count);
+
+ foreach (var item in firstList)
+ {
+ result.Add(item);
+ }
+
+ foreach (var item in secondList)
+ {
+ result.Add(item);
+ }
+
+ return result;
+ }
+
+ public List UsingAddNoCapacity(List firstList, List secondList)
+ {
+ var result = new List();
foreach (var item in firstList)
{
@@ -31,7 +48,17 @@ public List UsingEnumerableUnion(List firstList, List se
public List UsingAddRange(List firstList, List secondList)
{
- var result = new List(firstList.Count() + secondList.Count());
+ var result = new List(firstList.Count + secondList.Count);
+
+ result.AddRange(firstList);
+ result.AddRange(secondList);
+
+ return result;
+ }
+
+ public List UsingAddRangeNoCapacity(List firstList, List secondList)
+ {
+ var result = new List();
result.AddRange(firstList);
result.AddRange(secondList);
@@ -41,19 +68,26 @@ public List UsingAddRange(List firstList, List secondLis
public List UsingCopyTo(List firstList, List 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 UsingSelectMany(List firstList, List secondList)
- {
+ {
var combinedArray = new[] { firstList, secondList }.SelectMany(x => x);
return combinedArray.ToList();
}
+
+ public List UsingCollectionExpression(List firstList, List secondList)
+ {
+ List result = [.. firstList, .. secondList];
+
+ return result;
+ }
}
}
diff --git a/collections-lists/ConcatenateLists/ConcatenateLists/Program.cs b/collections-lists/ConcatenateLists/ConcatenateLists/Program.cs
index 2cee91b4bd..903fc38b57 100644
--- a/collections-lists/ConcatenateLists/ConcatenateLists/Program.cs
+++ b/collections-lists/ConcatenateLists/ConcatenateLists/Program.cs
@@ -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() { "Code", "Maze", "Concatenate" };
- var secondList = new List() { "Lists", "in", "C#" };
+var firstList = new List() { "Code", "Maze", "Concatenate" };
+var secondList = new List() { "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 list)
- {
- list.ForEach(x => Console.Write($" => {x}"));
- Console.WriteLine();
- }
+static void PrintOut(List list)
+{
+ list.ForEach(x => Console.Write($" => {x}"));
+ Console.WriteLine();
}
diff --git a/collections-lists/ConcatenateLists/Tests/Tests.cs b/collections-lists/ConcatenateLists/Tests/Tests.cs
index 1e4282e3a0..2a0c7447a5 100644
--- a/collections-lists/ConcatenateLists/Tests/Tests.cs
+++ b/collections-lists/ConcatenateLists/Tests/Tests.cs
@@ -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);
}
@@ -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);
}
@@ -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);
}
@@ -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);
}
@@ -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);
}
@@ -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 { "a", "a" }, new List { "a" });
+
+ Assert.Equal(new List { "a" }, result);
+ }
}
-}
\ No newline at end of file
+}
diff --git a/collections-lists/ConcatenateLists/Tests/Tests.csproj b/collections-lists/ConcatenateLists/Tests/Tests.csproj
index 8e094886bb..6d8aa37c6f 100644
--- a/collections-lists/ConcatenateLists/Tests/Tests.csproj
+++ b/collections-lists/ConcatenateLists/Tests/Tests.csproj
@@ -1,7 +1,7 @@
- net6.0
+ net10.0
enable
enable
@@ -9,13 +9,13 @@
-
-
-
+
+
+
runtime; build; native; contentfiles; analyzers; buildtransitive
all
-
+
runtime; build; native; contentfiles; analyzers; buildtransitive
all