Skip to content

Commit 0d80e43

Browse files
Merge branch 'main' into seo/72907-csharp-merge-arrays
2 parents 4b8e7ed + d1d342f commit 0d80e43

7 files changed

Lines changed: 153 additions & 60 deletions

File tree

‎collections-lists/ConcatenateLists/BenchmarkRunner/BenchmarkRunner.csproj‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22

33
<PropertyGroup>
44
<OutputType>Exe</OutputType>
5-
<TargetFramework>net6.0</TargetFramework>
5+
<TargetFramework>net10.0</TargetFramework>
66
<ImplicitUsings>enable</ImplicitUsings>
77
<Nullable>enable</Nullable>
88
</PropertyGroup>
99

1010
<ItemGroup>
11-
<PackageReference Include="BenchmarkDotNet" Version="0.13.1" />
11+
<PackageReference Include="BenchmarkDotNet" Version="0.15.8" />
1212
</ItemGroup>
1313

1414
<ItemGroup>

‎collections-lists/ConcatenateLists/BenchmarkRunner/ConcatenatorBenchmark.cs‎

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,30 @@ namespace BenchmarkRunner
99
[Orderer(SummaryOrderPolicy.FastestToSlowest)]
1010
public class ConcatenatorBenchmark
1111
{
12-
private readonly List<string> _firstList = Enumerable.Repeat("Code", 1_000_000).ToList();
13-
private readonly List<string> _secondList = Enumerable.Repeat("Maze", 1_000_000).ToList();
12+
[Params(50_000, 1_000_000)]
13+
public int Size;
14+
15+
private List<string> _firstList = [];
16+
private List<string> _secondList = [];
1417
private readonly Concatenator _concatenator = new();
15-
18+
19+
[GlobalSetup]
20+
public void Setup()
21+
{
22+
_firstList = Enumerable.Range(0, Size).Select(i => $"Code{i}").ToList();
23+
_secondList = Enumerable.Range(0, Size).Select(i => $"Maze{i}").ToList();
24+
}
25+
1626
[Benchmark]
1727
public void UsingAdd()
1828
{
19-
_concatenator.UsingAdd(_firstList, _secondList);
29+
_concatenator.UsingAdd(_firstList, _secondList);
30+
}
31+
32+
[Benchmark]
33+
public void UsingAddNoCapacity()
34+
{
35+
_concatenator.UsingAddNoCapacity(_firstList, _secondList);
2036
}
2137

2238
[Benchmark]
@@ -37,6 +53,12 @@ public void UsingAddRange()
3753
_concatenator.UsingAddRange(_firstList, _secondList);
3854
}
3955

56+
[Benchmark]
57+
public void UsingAddRangeNoCapacity()
58+
{
59+
_concatenator.UsingAddRangeNoCapacity(_firstList, _secondList);
60+
}
61+
4062
[Benchmark]
4163
public void UsingCopyTo()
4264
{
@@ -48,5 +70,11 @@ public void UsingSelectMany()
4870
{
4971
_concatenator.UsingSelectMany(_firstList, _secondList);
5072
}
73+
74+
[Benchmark]
75+
public void UsingCollectionExpression()
76+
{
77+
_concatenator.UsingCollectionExpression(_firstList, _secondList);
78+
}
5179
}
5280
}

‎collections-lists/ConcatenateLists/ConcatenateLists/ConcatenateLists.csproj‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<OutputType>Exe</OutputType>
5-
<TargetFramework>net6.0</TargetFramework>
5+
<TargetFramework>net10.0</TargetFramework>
66
<ImplicitUsings>enable</ImplicitUsings>
77
<Nullable>enable</Nullable>
88
</PropertyGroup>

‎collections-lists/ConcatenateLists/ConcatenateLists/Concatenator.cs‎

Lines changed: 41 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,24 @@ public class Concatenator
44
{
55
public List<string> UsingAdd(List<string> firstList, List<string> secondList)
66
{
7-
var result = new List<string>(firstList.Count() + secondList.Count());
7+
var result = new List<string>(firstList.Count + secondList.Count);
8+
9+
foreach (var item in firstList)
10+
{
11+
result.Add(item);
12+
}
13+
14+
foreach (var item in secondList)
15+
{
16+
result.Add(item);
17+
}
18+
19+
return result;
20+
}
21+
22+
public List<string> UsingAddNoCapacity(List<string> firstList, List<string> secondList)
23+
{
24+
var result = new List<string>();
825

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

3249
public List<string> UsingAddRange(List<string> firstList, List<string> secondList)
3350
{
34-
var result = new List<string>(firstList.Count() + secondList.Count());
51+
var result = new List<string>(firstList.Count + secondList.Count);
52+
53+
result.AddRange(firstList);
54+
result.AddRange(secondList);
55+
56+
return result;
57+
}
58+
59+
public List<string> UsingAddRangeNoCapacity(List<string> firstList, List<string> secondList)
60+
{
61+
var result = new List<string>();
3562

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

4269
public List<string> UsingCopyTo(List<string> firstList, List<string> secondList)
4370
{
44-
var combinedList = new string[firstList.Count() + secondList.Count()];
71+
var combinedArray = new string[firstList.Count + secondList.Count];
4572

46-
firstList.CopyTo(combinedList);
47-
secondList.CopyTo(combinedList, firstList.Count());
73+
firstList.CopyTo(combinedArray, 0);
74+
secondList.CopyTo(combinedArray, firstList.Count);
4875

49-
return combinedList.ToList();
76+
return combinedArray.ToList();
5077
}
5178

5279
public List<string> UsingSelectMany(List<string> firstList, List<string> secondList)
53-
{
80+
{
5481
var combinedArray = new[] { firstList, secondList }.SelectMany(x => x);
5582

5683
return combinedArray.ToList();
5784
}
85+
86+
public List<string> UsingCollectionExpression(List<string> firstList, List<string> secondList)
87+
{
88+
List<string> result = [.. firstList, .. secondList];
89+
90+
return result;
91+
}
5892
}
5993
}
Lines changed: 30 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,42 @@
1-
namespace ConcatenateLists;
1+
using ConcatenateLists;
22

3-
public class Program
4-
{
5-
public static void Main()
6-
{
7-
Console.WriteLine("---------- Concatenate Lists in C# ----------");
3+
Console.WriteLine("---------- Concatenate Lists in C# ----------");
84

9-
var firstList = new List<string>() { "Code", "Maze", "Concatenate" };
10-
var secondList = new List<string>() { "Lists", "in", "C#" };
5+
var firstList = new List<string>() { "Code", "Maze", "Concatenate" };
6+
var secondList = new List<string>() { "Lists", "in", "C#" };
117

12-
var concatenator = new Concatenator();
8+
var concatenator = new Concatenator();
139

14-
Console.WriteLine();
15-
Console.WriteLine("------ Concatenate lists using Add");
16-
PrintOut(concatenator.UsingAdd(firstList, secondList));
10+
Console.WriteLine();
11+
Console.WriteLine("------ Concatenate lists using Add");
12+
PrintOut(concatenator.UsingAdd(firstList, secondList));
1713

18-
Console.WriteLine();
19-
Console.WriteLine("------ Concatenate using Enumerable.Concat");
20-
PrintOut(concatenator.UsingEnumerableConcat(firstList, secondList));
14+
Console.WriteLine();
15+
Console.WriteLine("------ Concatenate using Enumerable.Concat");
16+
PrintOut(concatenator.UsingEnumerableConcat(firstList, secondList));
2117

22-
Console.WriteLine();
23-
Console.WriteLine("------ Concatenate using Enumerable.Union");
24-
PrintOut(concatenator.UsingEnumerableUnion(firstList, secondList));
18+
Console.WriteLine();
19+
Console.WriteLine("------ Concatenate using Enumerable.Union");
20+
PrintOut(concatenator.UsingEnumerableUnion(firstList, secondList));
2521

26-
Console.WriteLine();
27-
Console.WriteLine("------ Concatenate using AddRange");
28-
PrintOut(concatenator.UsingAddRange(firstList, secondList));
22+
Console.WriteLine();
23+
Console.WriteLine("------ Concatenate using AddRange");
24+
PrintOut(concatenator.UsingAddRange(firstList, secondList));
2925

30-
Console.WriteLine();
31-
Console.WriteLine("------ Concatenate using List CopyTo");
32-
PrintOut(concatenator.UsingCopyTo(firstList, secondList));
26+
Console.WriteLine();
27+
Console.WriteLine("------ Concatenate using List CopyTo");
28+
PrintOut(concatenator.UsingCopyTo(firstList, secondList));
3329

34-
Console.WriteLine();
35-
Console.WriteLine("------ Concatenate using SelectMany");
36-
PrintOut(concatenator.UsingSelectMany(firstList, secondList));
30+
Console.WriteLine();
31+
Console.WriteLine("------ Concatenate using SelectMany");
32+
PrintOut(concatenator.UsingSelectMany(firstList, secondList));
3733

38-
Console.ReadLine();
39-
}
34+
Console.WriteLine();
35+
Console.WriteLine("------ Concatenate using a collection expression");
36+
PrintOut(concatenator.UsingCollectionExpression(firstList, secondList));
4037

41-
private static void PrintOut(List<string> list)
42-
{
43-
list.ForEach(x => Console.Write($" => {x}"));
44-
Console.WriteLine();
45-
}
38+
static void PrintOut(List<string> list)
39+
{
40+
list.ForEach(x => Console.Write($" => {x}"));
41+
Console.WriteLine();
4642
}

‎collections-lists/ConcatenateLists/Tests/Tests.cs‎

Lines changed: 42 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,16 @@ public void GivenTwoLists_WhenUsingAddMethod_ThenReturnANewConcatenatedList()
1515
{
1616
var result = _concatenator.UsingAdd(_firstList, _secondList);
1717

18-
Assert.Equal(_expectedList.Count(), result.Count);
18+
Assert.Equal(_expectedList.Count, result.Count);
19+
Assert.Equal(_expectedList, result);
20+
}
21+
22+
[Fact]
23+
public void GivenTwoLists_WhenUsingAddNoCapacityMethod_ThenReturnANewConcatenatedList()
24+
{
25+
var result = _concatenator.UsingAddNoCapacity(_firstList, _secondList);
26+
27+
Assert.Equal(_expectedList.Count, result.Count);
1928
Assert.Equal(_expectedList, result);
2029
}
2130

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

27-
Assert.Equal(_expectedList.Count(), result.Count);
36+
Assert.Equal(_expectedList.Count, result.Count);
2837
Assert.Equal(_expectedList, result);
2938
}
3039

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

36-
Assert.Equal(_expectedList.Count(), result.Count);
45+
Assert.Equal(_expectedList.Count, result.Count);
3746
Assert.Equal(_expectedList, result);
3847
}
3948

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

45-
Assert.Equal(_expectedList.Count(), result.Count);
54+
Assert.Equal(_expectedList.Count, result.Count);
55+
Assert.Equal(_expectedList, result);
56+
}
57+
58+
[Fact]
59+
public void GivenTwoLists_WhenUsingAddRangeNoCapacityMethod_ThenReturnANewConcatenatedList()
60+
{
61+
var result = _concatenator.UsingAddRangeNoCapacity(_firstList, _secondList);
62+
63+
Assert.Equal(_expectedList.Count, result.Count);
4664
Assert.Equal(_expectedList, result);
4765
}
4866

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

54-
Assert.Equal(_expectedList.Count(), result.Count);
72+
Assert.Equal(_expectedList.Count, result.Count);
5573
Assert.Equal(_expectedList, result);
5674
}
5775

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

63-
Assert.Equal(_expectedList.Count(), result.Count);
81+
Assert.Equal(_expectedList.Count, result.Count);
6482
Assert.Equal(_expectedList, result);
6583
}
84+
85+
[Fact]
86+
public void GivenTwoLists_WhenUsingCollectionExpression_ThenReturnANewConcatenatedList()
87+
{
88+
var result = _concatenator.UsingCollectionExpression(_firstList, _secondList);
89+
90+
Assert.Equal(_expectedList.Count, result.Count);
91+
Assert.Equal(_expectedList, result);
92+
}
93+
94+
[Fact]
95+
public void GivenListsWithDuplicates_WhenUsingEnumerableUnionMethod_ThenReturnEachValueOnce()
96+
{
97+
var result = _concatenator.UsingEnumerableUnion(new List<string> { "a", "a" }, new List<string> { "a" });
98+
99+
Assert.Equal(new List<string> { "a" }, result);
100+
}
66101
}
67-
}
102+
}

‎collections-lists/ConcatenateLists/Tests/Tests.csproj‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>net6.0</TargetFramework>
4+
<TargetFramework>net10.0</TargetFramework>
55
<ImplicitUsings>enable</ImplicitUsings>
66
<Nullable>enable</Nullable>
77

88
<IsPackable>false</IsPackable>
99
</PropertyGroup>
1010

1111
<ItemGroup>
12-
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.1.0" />
13-
<PackageReference Include="xunit" Version="2.4.1" />
14-
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
12+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.10.1" />
13+
<PackageReference Include="xunit" Version="2.9.3" />
14+
<PackageReference Include="xunit.runner.visualstudio" Version="4.0.1">
1515
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
1616
<PrivateAssets>all</PrivateAssets>
1717
</PackageReference>
18-
<PackageReference Include="coverlet.collector" Version="3.1.2">
18+
<PackageReference Include="coverlet.collector" Version="10.1.0">
1919
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
2020
<PrivateAssets>all</PrivateAssets>
2121
</PackageReference>

0 commit comments

Comments
 (0)