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