Skip to content

Commit

Permalink
Add XML comment
Browse files Browse the repository at this point in the history
  • Loading branch information
Antyss77 committed Aug 20, 2023
1 parent 7f40c74 commit a4f5a93
Show file tree
Hide file tree
Showing 39 changed files with 141 additions and 59 deletions.
47 changes: 36 additions & 11 deletions Benchmarks/Benchmark.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,64 +9,89 @@


namespace Benchmark {

/// <summary>
/// Contains benchmarks for the StringExtension methods.
/// </summary>
[MemoryDiagnoser(false)]
public class StringExtensionBenchmark {
private readonly string input = "hello world!";
private readonly char[] charactersToRemove = {'l', 'o'};
private readonly string oldValue = "world";
private readonly string newValue = "everyone";

private readonly string input = "hello world!";
private readonly char[] charactersToRemove = { 'l', 'o' };
private readonly string substring = "l";

private readonly string phoneNumber = "555-555-5555";
private readonly string email = "[email protected]";

/// <summary>
/// Benchmark for the RemoveCharacters method.
/// </summary>
[Benchmark]
public string RemoveCharacters() {
return input.RemoveCharacters(charactersToRemove);
}

/// <summary>
/// Benchmark for the IsValidEmail method.
/// </summary>
[Benchmark]
public bool IsValidEmail() {
return email.IsValidEmail();
}

/// <summary>
/// Benchmark for the IsValidPhoneNumber method.
/// </summary>
[Benchmark]
public bool IsValidPhoneNumber() {
string phoneNumber = "555-555-5555";
return phoneNumber.IsValidPhoneNumber();
}

/// <summary>
/// Benchmark for the CountSubstring method.
/// </summary>
[Benchmark]
public int CountSubstring() {
return input.CountSubstring(substring);
}

/// <summary>
/// Benchmark for the ReverseWords method.
/// </summary>
[Benchmark]
public string ReverseWords() {
return input.ReverseWords();
}

/// <summary>
/// Benchmark for the IsPalindrome method.
/// </summary>
[Benchmark]
public bool IsPalindrome() {
string palindrome = "racecar";
return palindrome.IsPalindrome();
return input.IsPalindrome();
}

/// <summary>
/// Benchmark for the CountLetters method.
/// </summary>
[Benchmark]
public int CountLetters() {
return input.CountLetters();
}

/// <summary>
/// Benchmark for the RemoveDuplicateCharacters method.
/// </summary>
[Benchmark]
public string RemoveDuplicateCharacters() {
return input.RemoveDuplicateCharacters();
}

/// <summary>
/// Benchmark for the ConvertToCamelCase method.
/// </summary>
[Benchmark]
public string ConvertToCamelCase() {
string text = "hello_world";
return text.ToCamelCase();
return input.ToCamelCase();
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,14 @@ Intel Core i7-9750H CPU 2.60GHz, 1 CPU, 12 logical and 6 physical cores
```
| Method | Mean | Error | StdDev | Allocated |
|-------------------------- |----------:|---------:|----------:|----------:|
| RemoveCharacters | 305.79 ns | 5.967 ns | 8.168 ns | 328 B |
| IsValidEmail | 79.97 ns | 1.640 ns | 4.625 ns | - |
| IsValidPhoneNumber | 170.67 ns | 3.396 ns | 5.083 ns | - |
| CountSubstring | 64.06 ns | 0.470 ns | 0.417 ns | 40 B |
| ReverseWords | 44.00 ns | 0.954 ns | 1.949 ns | 152 B |
| IsPalindrome | 416.24 ns | 8.134 ns | 16.245 ns | 536 B |
| CountLetters | 104.75 ns | 0.732 ns | 0.612 ns | 32 B |
| RemoveDuplicateCharacters | 253.15 ns | 3.618 ns | 3.021 ns | 624 B |
| ConvertToCamelCase | 45.49 ns | 0.214 ns | 0.167 ns | 48 B |
| Method | Mean | Error | StdDev | Allocated |
|-------------------------- |----------:|----------:|----------:|----------:|
| RemoveCharacters | 368.67 ns | 7.008 ns | 17.058 ns | 328 B |
| IsValidEmail | 96.72 ns | 2.697 ns | 7.868 ns | - |
| IsValidPhoneNumber | 191.88 ns | 3.883 ns | 10.758 ns | - |
| CountSubstring | 63.27 ns | 1.306 ns | 1.603 ns | 40 B |
| ReverseWords | 46.03 ns | 0.977 ns | 1.432 ns | 152 B |
| IsPalindrome | 648.51 ns | 12.651 ns | 19.319 ns | 648 B |
| CountLetters | 123.07 ns | 2.478 ns | 6.396 ns | 32 B |
| RemoveDuplicateCharacters | 326.46 ns | 6.632 ns | 19.555 ns | 624 B |
| ConvertToCamelCase | 65.63 ns | 1.386 ns | 1.753 ns | 48 B |
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
Method;Job;AnalyzeLaunchVariance;EvaluateOverhead;MaxAbsoluteError;MaxRelativeError;MinInvokeCount;MinIterationTime;OutlierMode;Affinity;EnvironmentVariables;Jit;LargeAddressAware;Platform;PowerPlanMode;Runtime;AllowVeryLargeObjects;Concurrent;CpuGroups;Force;HeapAffinitizeMask;HeapCount;NoAffinitize;RetainVm;Server;Arguments;BuildConfiguration;Clock;EngineFactory;NuGetReferences;Toolchain;IsMutator;InvocationCount;IterationCount;IterationTime;LaunchCount;MaxIterationCount;MaxWarmupIterationCount;MemoryRandomization;MinIterationCount;MinWarmupIterationCount;RunStrategy;UnrollFactor;WarmupCount;Mean;Error;StdDev;Allocated
RemoveCharacters;DefaultJob;False;Default;Default;Default;Default;Default;Default;111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 7.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;305.79 ns;5.967 ns;8.168 ns;328 B
IsValidEmail;DefaultJob;False;Default;Default;Default;Default;Default;Default;111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 7.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;79.97 ns;1.640 ns;4.625 ns;0 B
IsValidPhoneNumber;DefaultJob;False;Default;Default;Default;Default;Default;Default;111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 7.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;170.67 ns;3.396 ns;5.083 ns;0 B
CountSubstring;DefaultJob;False;Default;Default;Default;Default;Default;Default;111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 7.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;64.06 ns;0.470 ns;0.417 ns;40 B
ReverseWords;DefaultJob;False;Default;Default;Default;Default;Default;Default;111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 7.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;44.00 ns;0.954 ns;1.949 ns;152 B
IsPalindrome;DefaultJob;False;Default;Default;Default;Default;Default;Default;111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 7.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;416.24 ns;8.134 ns;16.245 ns;536 B
CountLetters;DefaultJob;False;Default;Default;Default;Default;Default;Default;111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 7.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;104.75 ns;0.732 ns;0.612 ns;32 B
RemoveDuplicateCharacters;DefaultJob;False;Default;Default;Default;Default;Default;Default;111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 7.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;253.15 ns;3.618 ns;3.021 ns;624 B
ConvertToCamelCase;DefaultJob;False;Default;Default;Default;Default;Default;Default;111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 7.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;45.49 ns;0.214 ns;0.167 ns;48 B
RemoveCharacters;DefaultJob;False;Default;Default;Default;Default;Default;Default;111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 7.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;368.67 ns;7.008 ns;17.058 ns;328 B
IsValidEmail;DefaultJob;False;Default;Default;Default;Default;Default;Default;111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 7.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;96.72 ns;2.697 ns;7.868 ns;0 B
IsValidPhoneNumber;DefaultJob;False;Default;Default;Default;Default;Default;Default;111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 7.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;191.88 ns;3.883 ns;10.758 ns;0 B
CountSubstring;DefaultJob;False;Default;Default;Default;Default;Default;Default;111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 7.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;63.27 ns;1.306 ns;1.603 ns;40 B
ReverseWords;DefaultJob;False;Default;Default;Default;Default;Default;Default;111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 7.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;46.03 ns;0.977 ns;1.432 ns;152 B
IsPalindrome;DefaultJob;False;Default;Default;Default;Default;Default;Default;111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 7.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;648.51 ns;12.651 ns;19.319 ns;648 B
CountLetters;DefaultJob;False;Default;Default;Default;Default;Default;Default;111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 7.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;123.07 ns;2.478 ns;6.396 ns;32 B
RemoveDuplicateCharacters;DefaultJob;False;Default;Default;Default;Default;Default;Default;111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 7.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;326.46 ns;6.632 ns;19.555 ns;624 B
ConvertToCamelCase;DefaultJob;False;Default;Default;Default;Default;Default;Default;111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 7.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;65.63 ns;1.386 ns;1.753 ns;48 B
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<html lang='en'>
<head>
<meta charset='utf-8' />
<title>Benchmark.StringExtensionBenchmark-20230816-155011</title>
<title>Benchmark.StringExtensionBenchmark-20230820-043153</title>

<style type="text/css">
table { border-collapse: collapse; display: block; width: 100%; overflow: auto; }
Expand All @@ -24,15 +24,15 @@
<table>
<thead><tr><th> Method</th><th>Mean</th><th>Error</th><th>StdDev</th><th>Allocated</th>
</tr>
</thead><tbody><tr><td>RemoveCharacters</td><td>305.79 ns</td><td>5.967 ns</td><td>8.168 ns</td><td>328 B</td>
</tr><tr><td>IsValidEmail</td><td>79.97 ns</td><td>1.640 ns</td><td>4.625 ns</td><td>-</td>
</tr><tr><td>IsValidPhoneNumber</td><td>170.67 ns</td><td>3.396 ns</td><td>5.083 ns</td><td>-</td>
</tr><tr><td>CountSubstring</td><td>64.06 ns</td><td>0.470 ns</td><td>0.417 ns</td><td>40 B</td>
</tr><tr><td>ReverseWords</td><td>44.00 ns</td><td>0.954 ns</td><td>1.949 ns</td><td>152 B</td>
</tr><tr><td>IsPalindrome</td><td>416.24 ns</td><td>8.134 ns</td><td>16.245 ns</td><td>536 B</td>
</tr><tr><td>CountLetters</td><td>104.75 ns</td><td>0.732 ns</td><td>0.612 ns</td><td>32 B</td>
</tr><tr><td>RemoveDuplicateCharacters</td><td>253.15 ns</td><td>3.618 ns</td><td>3.021 ns</td><td>624 B</td>
</tr><tr><td>ConvertToCamelCase</td><td>45.49 ns</td><td>0.214 ns</td><td>0.167 ns</td><td>48 B</td>
</thead><tbody><tr><td>RemoveCharacters</td><td>368.67 ns</td><td>7.008 ns</td><td>17.058 ns</td><td>328 B</td>
</tr><tr><td>IsValidEmail</td><td>96.72 ns</td><td>2.697 ns</td><td>7.868 ns</td><td>-</td>
</tr><tr><td>IsValidPhoneNumber</td><td>191.88 ns</td><td>3.883 ns</td><td>10.758 ns</td><td>-</td>
</tr><tr><td>CountSubstring</td><td>63.27 ns</td><td>1.306 ns</td><td>1.603 ns</td><td>40 B</td>
</tr><tr><td>ReverseWords</td><td>46.03 ns</td><td>0.977 ns</td><td>1.432 ns</td><td>152 B</td>
</tr><tr><td>IsPalindrome</td><td>648.51 ns</td><td>12.651 ns</td><td>19.319 ns</td><td>648 B</td>
</tr><tr><td>CountLetters</td><td>123.07 ns</td><td>2.478 ns</td><td>6.396 ns</td><td>32 B</td>
</tr><tr><td>RemoveDuplicateCharacters</td><td>326.46 ns</td><td>6.632 ns</td><td>19.555 ns</td><td>624 B</td>
</tr><tr><td>ConvertToCamelCase</td><td>65.63 ns</td><td>1.386 ns</td><td>1.753 ns</td><td>48 B</td>
</tr></tbody></table>
</body>
</html>
Binary file modified Benchmarks/bin/Debug/net7.0/Benchmarks.dll
Binary file not shown.
Binary file modified Benchmarks/bin/Debug/net7.0/Benchmarks.pdb
Binary file not shown.
Binary file modified Benchmarks/bin/Debug/net7.0/StringExtension.dll
Binary file not shown.
Binary file modified Benchmarks/bin/Debug/net7.0/StringExtension.pdb
Binary file not shown.
Binary file modified Benchmarks/bin/Release/net7.0/Benchmarks.dll
Binary file not shown.
Binary file modified Benchmarks/bin/Release/net7.0/Benchmarks.pdb
Binary file not shown.
Binary file modified Benchmarks/bin/Release/net7.0/StringExtension.dll
Binary file not shown.
Binary file modified Benchmarks/bin/Release/net7.0/StringExtension.pdb
Binary file not shown.
Binary file not shown.
Binary file modified Benchmarks/obj/Debug/net7.0/Benchmarks.dll
Binary file not shown.
Binary file modified Benchmarks/obj/Debug/net7.0/Benchmarks.pdb
Binary file not shown.
Binary file modified Benchmarks/obj/Debug/net7.0/ref/Benchmarks.dll
Binary file not shown.
Binary file modified Benchmarks/obj/Debug/net7.0/refint/Benchmarks.dll
Binary file not shown.
Binary file not shown.
Binary file modified Benchmarks/obj/Release/net7.0/Benchmarks.dll
Binary file not shown.
Binary file modified Benchmarks/obj/Release/net7.0/Benchmarks.pdb
Binary file not shown.
Binary file modified Benchmarks/obj/Release/net7.0/ref/Benchmarks.dll
Binary file not shown.
Binary file modified Benchmarks/obj/Release/net7.0/refint/Benchmarks.dll
Binary file not shown.
49 changes: 35 additions & 14 deletions StringExtension/StringExtension.cs
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
using System.Text;
using System.Text.RegularExpressions;


namespace StringExtension {
/// <summary>
/// Provides extension methods for string manipulation.
/// </summary>
public static partial class StringExtension {

/// <summary>
/// Represents a regular expression that can be used to validate a mail address.
/// Represents a regular expression that can be used to validate an email address.
/// </summary>
/// <returns>A regular expression that can be used to validate a mail address.</returns>
/// <returns>A regular expression that can be used to validate an email address.</returns>
[GeneratedRegex(@"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$")]
private static partial Regex MailAddressRegex();

Expand All @@ -18,13 +21,16 @@ public static partial class StringExtension {
[GeneratedRegex(@"^(\+?\d{1,3}[\s-]?)?\(?\d{3}\)?[\s-]?\d{3}[\s-]?\d{4}$")]
private static partial Regex PhoneNumberRegex();


// Removes specified characters from the given string
/// <summary>
/// Removes specified characters from the given string.
/// </summary>
/// <param name="input">The input string.</param>
/// <param name="charactersToRemove">An array of characters to remove.</param>
/// <returns>A new string with specified characters removed.</returns>
public static string RemoveCharacters(this string input, char[] charactersToRemove) {
return new string(input.Where(c => !charactersToRemove.Contains(c)).ToArray());
}


/// <summary>
/// Validates the given email address.
/// </summary>
Expand All @@ -34,7 +40,6 @@ public static bool IsValidEmail(this string email) {
return !string.IsNullOrEmpty(email) && MailAddressRegex().IsMatch(email);
}


/// <summary>
/// Validates the given phone number.
/// </summary>
Expand All @@ -44,7 +49,12 @@ public static bool IsValidPhoneNumber(this string phoneNumber) {
return !string.IsNullOrEmpty(phoneNumber) && PhoneNumberRegex().IsMatch(phoneNumber);
}

// Counts the number of occurrences of a substring in the given string
/// <summary>
/// Counts the number of occurrences of a substring in the given string.
/// </summary>
/// <param name="input">The input string.</param>
/// <param name="substring">The substring to count.</param>
/// <returns>The number of occurrences of the substring in the input string.</returns>
public static int CountSubstring(this string input, string substring) {
if (string.IsNullOrEmpty(input) || string.IsNullOrEmpty(substring))
{
Expand Down Expand Up @@ -83,7 +93,11 @@ public static string ReverseWords(this string input) {
return builder.ToString();
}

// Determines if the given string is a palindrome
/// <summary>
/// Determines if the given string is a palindrome.
/// </summary>
/// <param name="input">The input string.</param>
/// <returns><c>true</c> if the string is a palindrome; otherwise, <c>false</c>.</returns>
public static bool IsPalindrome(this string input) {
// Remove all non-letter characters and convert to lowercase
string cleanString = new string(input.Where(char.IsLetter).Select(char.ToLower).ToArray());
Expand All @@ -92,14 +106,21 @@ public static bool IsPalindrome(this string input) {
return cleanString == new string(cleanString.Reverse().ToArray());
}


// Counts the number of letters in the given string
/// <summary>
/// Counts the number of letters in the given string.
/// </summary>
/// <param name="input">The input string.</param>
/// <returns>The number of letters in the input string.</returns>
public static int CountLetters(this string input) {
// Remove all non-letter characters and count the length of the resulting string
return input.Count(char.IsLetter);
}

// Removes duplicate characters from the given string
/// <summary>
/// Removes duplicate characters from the given string.
/// </summary>
/// <param name="input">The input string.</param>
/// <returns>A new string with duplicate characters removed.</returns>
public static string RemoveDuplicateCharacters(this string input) {
if (string.IsNullOrEmpty(input))
{
Expand All @@ -116,7 +137,7 @@ public static string RemoveDuplicateCharacters(this string input) {
/// <summary>
/// Converts the given string to camel case.
/// </summary>
/// <param name="input">The input to transform.</param>
/// <param name="input">The input string.</param>
/// <returns>The input string converted to camel case.</returns>
public static string ToCamelCase(this string input) {
if (string.IsNullOrEmpty(input))
Expand Down Expand Up @@ -154,4 +175,4 @@ public static string ToCamelCase(this string input) {
return new string(output[..outputIndex]);
}
}
}
}
Binary file modified StringExtension/bin/Debug/net7.0/StringExtension.dll
Binary file not shown.
Binary file modified StringExtension/bin/Debug/net7.0/StringExtension.pdb
Binary file not shown.
Binary file modified StringExtension/bin/Release/net7.0/StringExtension.dll
Binary file not shown.
Binary file modified StringExtension/bin/Release/net7.0/StringExtension.pdb
Binary file not shown.
Binary file modified StringExtension/obj/Debug/net7.0/StringExtension.dll
Binary file not shown.
Binary file modified StringExtension/obj/Debug/net7.0/StringExtension.pdb
Binary file not shown.
Binary file modified StringExtension/obj/Release/net7.0/StringExtension.dll
Binary file not shown.
Binary file modified StringExtension/obj/Release/net7.0/StringExtension.pdb
Binary file not shown.
Loading

0 comments on commit a4f5a93

Please sign in to comment.