diff --git a/Exercism.sln b/Exercism.sln
index 9bfea21..93c3c2f 100644
--- a/Exercism.sln
+++ b/Exercism.sln
@@ -95,6 +95,18 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RationalNumbers", "csharp\r
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PerfectNumbers", "csharp\perfect-numbers\PerfectNumbers.csproj", "{C424BB3E-AADC-42A0-889E-BE1C5A53C2F3}"
EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ProteinTranslation", "csharp\protein-translation\ProteinTranslation.csproj", "{FCB4EC34-86A9-4E7A-BF83-AC618505ACE9}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DifferenceOfSquares", "csharp\difference-of-squares\DifferenceOfSquares.csproj", "{022A3C14-C825-4797-B4C1-80CE4BB1AD4B}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Triangle", "csharp\triangle\Triangle.csproj", "{53575277-DC47-4597-92FB-C3D28344B88F}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Darts", "csharp\darts\Darts.csproj", "{4A6A7678-F939-4EBD-B50E-A68943F4016B}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FlattenArray", "csharp\flatten-array\FlattenArray.csproj", "{4C529743-AE36-42E5-A63F-9054ABD2E80B}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Proverb", "csharp\proverb\Proverb.csproj", "{CEC032AD-5DF7-4FDD-B389-764B96323A8E}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -285,6 +297,30 @@ Global
{C424BB3E-AADC-42A0-889E-BE1C5A53C2F3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C424BB3E-AADC-42A0-889E-BE1C5A53C2F3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C424BB3E-AADC-42A0-889E-BE1C5A53C2F3}.Release|Any CPU.Build.0 = Release|Any CPU
+ {FCB4EC34-86A9-4E7A-BF83-AC618505ACE9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {FCB4EC34-86A9-4E7A-BF83-AC618505ACE9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FCB4EC34-86A9-4E7A-BF83-AC618505ACE9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {FCB4EC34-86A9-4E7A-BF83-AC618505ACE9}.Release|Any CPU.Build.0 = Release|Any CPU
+ {022A3C14-C825-4797-B4C1-80CE4BB1AD4B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {022A3C14-C825-4797-B4C1-80CE4BB1AD4B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {022A3C14-C825-4797-B4C1-80CE4BB1AD4B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {022A3C14-C825-4797-B4C1-80CE4BB1AD4B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {53575277-DC47-4597-92FB-C3D28344B88F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {53575277-DC47-4597-92FB-C3D28344B88F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {53575277-DC47-4597-92FB-C3D28344B88F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {53575277-DC47-4597-92FB-C3D28344B88F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {4A6A7678-F939-4EBD-B50E-A68943F4016B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {4A6A7678-F939-4EBD-B50E-A68943F4016B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {4A6A7678-F939-4EBD-B50E-A68943F4016B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {4A6A7678-F939-4EBD-B50E-A68943F4016B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {4C529743-AE36-42E5-A63F-9054ABD2E80B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {4C529743-AE36-42E5-A63F-9054ABD2E80B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {4C529743-AE36-42E5-A63F-9054ABD2E80B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {4C529743-AE36-42E5-A63F-9054ABD2E80B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {CEC032AD-5DF7-4FDD-B389-764B96323A8E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {CEC032AD-5DF7-4FDD-B389-764B96323A8E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {CEC032AD-5DF7-4FDD-B389-764B96323A8E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {CEC032AD-5DF7-4FDD-B389-764B96323A8E}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/csharp/darts/.editorconfig b/csharp/darts/.editorconfig
new file mode 100644
index 0000000..bad2b44
--- /dev/null
+++ b/csharp/darts/.editorconfig
@@ -0,0 +1,141 @@
+###############################
+# Core EditorConfig Options #
+###############################
+
+; This file is for unifying the coding style for different editors and IDEs.
+; More information at:
+; https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference?view=vs-2017
+; https://docs.microsoft.com/en-us/visualstudio/ide/create-portable-custom-editor-options?view=vs-2017
+
+root = true
+
+[*]
+indent_style = space
+
+[Darts.cs]
+indent_size = 4
+
+###############################
+# .NET Coding Conventions #
+###############################
+
+# Organize usings
+dotnet_sort_system_directives_first = true
+dotnet_separate_import_directive_groups = true
+
+# this. preferences
+dotnet_style_qualification_for_field = false:suggestion
+dotnet_style_qualification_for_property = false:suggestion
+dotnet_style_qualification_for_method = false:suggestion
+dotnet_style_qualification_for_event = false:suggestion
+
+# Language keywords vs BCL types preferences
+dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion
+dotnet_style_predefined_type_for_member_access = true:suggestion
+
+# Parentheses preferences
+dotnet_style_parentheses_in_arithmetic_binary_operators = never_if_unnecessary:none
+dotnet_style_parentheses_in_relational_binary_operators = never_if_unnecessary:none
+dotnet_style_parentheses_in_other_binary_operators = never_if_unnecessary:none
+dotnet_style_parentheses_in_other_operators = never_if_unnecessary:suggestion
+
+# Modifier preferences
+dotnet_style_require_accessibility_modifiers = always:suggestion
+dotnet_style_readonly_field = true:suggestion
+
+# Expression-level preferences
+dotnet_style_object_initializer = true:suggestion
+dotnet_style_collection_initializer = true:suggestion
+dotnet_style_explicit_tuple_names = true:suggestion
+dotnet_style_prefer_inferred_tuple_names = true:suggestion
+dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
+dotnet_style_prefer_auto_properties = true:suggestion
+dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion
+dotnet_style_prefer_conditional_expression_over_assignment = true:suggestion
+dotnet_style_prefer_conditional_expression_over_return = true:suggestion
+dotnet_style_coalesce_expression = true:suggestion
+dotnet_style_null_propagation = true:suggestion
+
+###############################
+# Naming Conventions #
+###############################
+
+# Style Definitions
+dotnet_naming_style.pascal_case_style.capitalization = pascal_case
+
+# Use PascalCase for constant fields
+dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion
+dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields
+dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style
+dotnet_naming_symbols.constant_fields.applicable_kinds = field
+dotnet_naming_symbols.constant_fields.applicable_accessibilities = *
+dotnet_naming_symbols.constant_fields.required_modifiers = const
+
+###############################
+# C# Code Style Rules #
+###############################
+
+# var preferences
+csharp_style_var_for_built_in_types = true:none
+csharp_style_var_when_type_is_apparent = true:none
+csharp_style_var_elsewhere = true:none
+
+# Expression-bodied members
+csharp_style_expression_bodied_methods = true:suggestion
+csharp_style_expression_bodied_constructors = true:suggestion
+csharp_style_expression_bodied_operators = true:suggestion
+csharp_style_expression_bodied_properties = true:suggestion
+csharp_style_expression_bodied_indexers = true:suggestion
+csharp_style_expression_bodied_accessors = true:suggestion
+
+# Pattern-matching preferences
+csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion
+csharp_style_pattern_matching_over_as_with_null_check = true:suggestion
+
+# Null-checking preferences
+csharp_style_throw_expression = true:suggestion
+csharp_style_conditional_delegate_call = true:suggestion
+
+# Modifier preferences
+csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:suggestion
+
+# Expression-level preferences
+csharp_prefer_braces = true:none
+csharp_prefer_simple_default_expression = true:suggestion
+csharp_style_deconstructed_variable_declaration = true:suggestion
+csharp_style_pattern_local_over_anonymous_function = true:suggestion
+csharp_style_inlined_variable_declaration = true:suggestion
+
+###############################
+# C# Formatting Rules #
+###############################
+
+# New line preferences
+csharp_new_line_before_open_brace = all
+csharp_new_line_before_else = true
+csharp_new_line_before_catch = true
+csharp_new_line_before_finally = true
+csharp_new_line_before_members_in_object_initializers = false
+csharp_new_line_before_members_in_anonymous_types = false
+csharp_new_line_between_query_expression_clauses = true
+
+# Indentation preferences
+csharp_indent_case_contents = true
+csharp_indent_switch_labels = true
+csharp_indent_labels = flush_left
+
+# Space preferences
+csharp_space_after_cast = false
+csharp_space_after_keywords_in_control_flow_statements = true
+csharp_space_between_method_declaration_parameter_list_parentheses = false
+csharp_space_between_method_call_parameter_list_parentheses = false
+csharp_space_before_colon_in_inheritance_clause = true
+csharp_space_after_colon_in_inheritance_clause = true
+csharp_space_around_binary_operators = before_and_after
+csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
+csharp_space_between_method_call_name_and_opening_parenthesis = false
+csharp_space_between_method_call_empty_parameter_list_parentheses = false
+
+# Wrapping preferences
+csharp_preserve_single_line_blocks = true
+csharp_preserve_single_line_statements = true
diff --git a/csharp/darts/.exercism/config.json b/csharp/darts/.exercism/config.json
new file mode 100644
index 0000000..9f082c7
--- /dev/null
+++ b/csharp/darts/.exercism/config.json
@@ -0,0 +1,25 @@
+{
+ "blurb": "Write a function that returns the earned points in a single toss of a Darts game",
+ "authors": [
+ "bmeverett"
+ ],
+ "contributors": [
+ "ErikSchierboom",
+ "j2jensen",
+ "robkeim",
+ "sjwarner",
+ "wolf99"
+ ],
+ "files": {
+ "solution": [
+ "Darts.cs"
+ ],
+ "test": [
+ "DartsTests.cs"
+ ],
+ "example": [
+ ".meta/Example.cs"
+ ]
+ },
+ "source": "Inspired by an exercise created by a professor Della Paolera in Argentina"
+}
diff --git a/csharp/darts/.exercism/metadata.json b/csharp/darts/.exercism/metadata.json
new file mode 100644
index 0000000..3958b18
--- /dev/null
+++ b/csharp/darts/.exercism/metadata.json
@@ -0,0 +1 @@
+{"track":"csharp","exercise":"darts","id":"ed58a1226c504827a927b77954158cad","url":"https://exercism.org/tracks/csharp/exercises/darts","handle":"benharri","is_requester":true,"auto_approve":false}
\ No newline at end of file
diff --git a/csharp/darts/Darts.cs b/csharp/darts/Darts.cs
new file mode 100644
index 0000000..c72f7be
--- /dev/null
+++ b/csharp/darts/Darts.cs
@@ -0,0 +1,13 @@
+using System;
+
+public static class Darts
+{
+ public static int Score(double x, double y) =>
+ Math.Sqrt(x * x + y * y) switch
+ {
+ <= 1 => 10,
+ <= 5 => 5,
+ <= 10 => 1,
+ _ => 0
+ };
+}
diff --git a/csharp/darts/Darts.csproj b/csharp/darts/Darts.csproj
new file mode 100644
index 0000000..bc1b5d6
--- /dev/null
+++ b/csharp/darts/Darts.csproj
@@ -0,0 +1,14 @@
+
+
+
+ net6.0
+
+
+
+
+
+
+
+
+
+
diff --git a/csharp/darts/DartsTests.cs b/csharp/darts/DartsTests.cs
new file mode 100644
index 0000000..18e80f1
--- /dev/null
+++ b/csharp/darts/DartsTests.cs
@@ -0,0 +1,82 @@
+using Xunit;
+
+public class DartsTests
+{
+ [Fact]
+ public void Missed_target()
+ {
+ Assert.Equal(0, Darts.Score(-9, 9));
+ }
+
+ [Fact]
+ public void On_the_outer_circle()
+ {
+ Assert.Equal(1, Darts.Score(0, 10));
+ }
+
+ [Fact]
+ public void On_the_middle_circle()
+ {
+ Assert.Equal(5, Darts.Score(-5, 0));
+ }
+
+ [Fact]
+ public void On_the_inner_circle()
+ {
+ Assert.Equal(10, Darts.Score(0, -1));
+ }
+
+ [Fact]
+ public void Exactly_on_centre()
+ {
+ Assert.Equal(10, Darts.Score(0, 0));
+ }
+
+ [Fact]
+ public void Near_the_centre()
+ {
+ Assert.Equal(10, Darts.Score(-0.1, -0.1));
+ }
+
+ [Fact]
+ public void Just_within_the_inner_circle()
+ {
+ Assert.Equal(10, Darts.Score(0.7, 0.7));
+ }
+
+ [Fact]
+ public void Just_outside_the_inner_circle()
+ {
+ Assert.Equal(5, Darts.Score(0.8, -0.8));
+ }
+
+ [Fact]
+ public void Just_within_the_middle_circle()
+ {
+ Assert.Equal(5, Darts.Score(-3.5, 3.5));
+ }
+
+ [Fact]
+ public void Just_outside_the_middle_circle()
+ {
+ Assert.Equal(1, Darts.Score(-3.6, -3.6));
+ }
+
+ [Fact]
+ public void Just_within_the_outer_circle()
+ {
+ Assert.Equal(1, Darts.Score(-7, 7));
+ }
+
+ [Fact]
+ public void Just_outside_the_outer_circle()
+ {
+ Assert.Equal(0, Darts.Score(7.1, -7.1));
+ }
+
+ [Fact]
+ public void Asymmetric_position_between_the_inner_and_middle_circles()
+ {
+ Assert.Equal(5, Darts.Score(0.5, -4));
+ }
+}
\ No newline at end of file
diff --git a/csharp/darts/HELP.md b/csharp/darts/HELP.md
new file mode 100644
index 0000000..5febe8b
--- /dev/null
+++ b/csharp/darts/HELP.md
@@ -0,0 +1,39 @@
+# Help
+
+## Running the tests
+
+You can run the tests by opening a command prompt in the exercise's directory, and then running the [`dotnet test` command](https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-test)
+Alternatively, most IDE's have built-in support for running tests, including [Visual Studio](https://docs.microsoft.com/en-us/visualstudio/test/run-unit-tests-with-test-explorer), [Rider](https://www.jetbrains.com/help/rider/Unit_Testing_in_Solution.html) and [Visual Studio code](https://github.com/OmniSharp/omnisharp-vscode/wiki/How-to-run-and-debug-unit-tests).
+See the [tests page](https://exercism.io/tracks/csharp/tests) for more information.
+
+## Skipped tests
+
+Initially, only the first test will be enabled.
+This is to encourage you to solve the exercise one step at a time.
+Once you get the first test passing, remove the `Skip` property from the next test and work on getting that test passing.
+
+## Submitting your solution
+
+You can submit your solution using the `exercism submit Darts.cs` command.
+This command will upload your solution to the Exercism website and print the solution page's URL.
+
+It's possible to submit an incomplete solution which allows you to:
+
+- See how others have completed the exercise
+- Request help from a mentor
+
+## Need to get help?
+
+If you'd like help solving the exercise, check the following pages:
+
+- The [C# track's documentation](https://exercism.org/docs/tracks/csharp)
+- [Exercism's support channel on gitter](https://gitter.im/exercism/support)
+- The [Frequently Asked Questions](https://exercism.org/docs/using/faqs)
+
+Should those resources not suffice, you could submit your (incomplete) solution to request mentoring.
+
+To get help if you're having trouble, you can use one of the following resources:
+
+- [Gitter](https://gitter.im/exercism/xcsharp) is Exercism C# track's Gitter room; go here to get support and ask questions related to the C# track.
+- [/r/csharp](https://www.reddit.com/r/csharp) is the C# subreddit.
+- [StackOverflow](http://stackoverflow.com/questions/tagged/c%23) can be used to search for your problem and see if it has been answered already. You can also ask and answer questions.
\ No newline at end of file
diff --git a/csharp/darts/README.md b/csharp/darts/README.md
new file mode 100644
index 0000000..20322dd
--- /dev/null
+++ b/csharp/darts/README.md
@@ -0,0 +1,40 @@
+# Darts
+
+Welcome to Darts on Exercism's C# Track.
+If you need help running the tests or submitting your code, check out `HELP.md`.
+
+## Instructions
+
+Write a function that returns the earned points in a single toss of a Darts game.
+
+[Darts](https://en.wikipedia.org/wiki/Darts) is a game where players
+throw darts to a [target](https://en.wikipedia.org/wiki/Darts#/media/File:Darts_in_a_dartboard.jpg).
+
+In our particular instance of the game, the target rewards with 4 different amounts of points, depending on where the dart lands:
+
+* If the dart lands outside the target, player earns no points (0 points).
+* If the dart lands in the outer circle of the target, player earns 1 point.
+* If the dart lands in the middle circle of the target, player earns 5 points.
+* If the dart lands in the inner circle of the target, player earns 10 points.
+
+The outer circle has a radius of 10 units (This is equivalent to the total radius for the entire target), the middle circle a radius of 5 units, and the inner circle a radius of 1. Of course, they are all centered to the same point (That is, the circles are [concentric](http://mathworld.wolfram.com/ConcentricCircles.html)) defined by the coordinates (0, 0).
+
+Write a function that given a point in the target (defined by its `real` cartesian coordinates `x` and `y`), returns the correct amount earned by a dart landing in that point.
+
+## Source
+
+### Created by
+
+- @bmeverett
+
+### Contributed to by
+
+- @ErikSchierboom
+- @j2jensen
+- @robkeim
+- @sjwarner
+- @wolf99
+
+### Based on
+
+Inspired by an exercise created by a professor Della Paolera in Argentina
\ No newline at end of file
diff --git a/csharp/difference-of-squares/.editorconfig b/csharp/difference-of-squares/.editorconfig
new file mode 100644
index 0000000..5128725
--- /dev/null
+++ b/csharp/difference-of-squares/.editorconfig
@@ -0,0 +1,141 @@
+###############################
+# Core EditorConfig Options #
+###############################
+
+; This file is for unifying the coding style for different editors and IDEs.
+; More information at:
+; https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference?view=vs-2017
+; https://docs.microsoft.com/en-us/visualstudio/ide/create-portable-custom-editor-options?view=vs-2017
+
+root = true
+
+[*]
+indent_style = space
+
+[DifferenceOfSquares.cs]
+indent_size = 4
+
+###############################
+# .NET Coding Conventions #
+###############################
+
+# Organize usings
+dotnet_sort_system_directives_first = true
+dotnet_separate_import_directive_groups = true
+
+# this. preferences
+dotnet_style_qualification_for_field = false:suggestion
+dotnet_style_qualification_for_property = false:suggestion
+dotnet_style_qualification_for_method = false:suggestion
+dotnet_style_qualification_for_event = false:suggestion
+
+# Language keywords vs BCL types preferences
+dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion
+dotnet_style_predefined_type_for_member_access = true:suggestion
+
+# Parentheses preferences
+dotnet_style_parentheses_in_arithmetic_binary_operators = never_if_unnecessary:none
+dotnet_style_parentheses_in_relational_binary_operators = never_if_unnecessary:none
+dotnet_style_parentheses_in_other_binary_operators = never_if_unnecessary:none
+dotnet_style_parentheses_in_other_operators = never_if_unnecessary:suggestion
+
+# Modifier preferences
+dotnet_style_require_accessibility_modifiers = always:suggestion
+dotnet_style_readonly_field = true:suggestion
+
+# Expression-level preferences
+dotnet_style_object_initializer = true:suggestion
+dotnet_style_collection_initializer = true:suggestion
+dotnet_style_explicit_tuple_names = true:suggestion
+dotnet_style_prefer_inferred_tuple_names = true:suggestion
+dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
+dotnet_style_prefer_auto_properties = true:suggestion
+dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion
+dotnet_style_prefer_conditional_expression_over_assignment = true:suggestion
+dotnet_style_prefer_conditional_expression_over_return = true:suggestion
+dotnet_style_coalesce_expression = true:suggestion
+dotnet_style_null_propagation = true:suggestion
+
+###############################
+# Naming Conventions #
+###############################
+
+# Style Definitions
+dotnet_naming_style.pascal_case_style.capitalization = pascal_case
+
+# Use PascalCase for constant fields
+dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion
+dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields
+dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style
+dotnet_naming_symbols.constant_fields.applicable_kinds = field
+dotnet_naming_symbols.constant_fields.applicable_accessibilities = *
+dotnet_naming_symbols.constant_fields.required_modifiers = const
+
+###############################
+# C# Code Style Rules #
+###############################
+
+# var preferences
+csharp_style_var_for_built_in_types = true:none
+csharp_style_var_when_type_is_apparent = true:none
+csharp_style_var_elsewhere = true:none
+
+# Expression-bodied members
+csharp_style_expression_bodied_methods = true:suggestion
+csharp_style_expression_bodied_constructors = true:suggestion
+csharp_style_expression_bodied_operators = true:suggestion
+csharp_style_expression_bodied_properties = true:suggestion
+csharp_style_expression_bodied_indexers = true:suggestion
+csharp_style_expression_bodied_accessors = true:suggestion
+
+# Pattern-matching preferences
+csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion
+csharp_style_pattern_matching_over_as_with_null_check = true:suggestion
+
+# Null-checking preferences
+csharp_style_throw_expression = true:suggestion
+csharp_style_conditional_delegate_call = true:suggestion
+
+# Modifier preferences
+csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:suggestion
+
+# Expression-level preferences
+csharp_prefer_braces = true:none
+csharp_prefer_simple_default_expression = true:suggestion
+csharp_style_deconstructed_variable_declaration = true:suggestion
+csharp_style_pattern_local_over_anonymous_function = true:suggestion
+csharp_style_inlined_variable_declaration = true:suggestion
+
+###############################
+# C# Formatting Rules #
+###############################
+
+# New line preferences
+csharp_new_line_before_open_brace = all
+csharp_new_line_before_else = true
+csharp_new_line_before_catch = true
+csharp_new_line_before_finally = true
+csharp_new_line_before_members_in_object_initializers = false
+csharp_new_line_before_members_in_anonymous_types = false
+csharp_new_line_between_query_expression_clauses = true
+
+# Indentation preferences
+csharp_indent_case_contents = true
+csharp_indent_switch_labels = true
+csharp_indent_labels = flush_left
+
+# Space preferences
+csharp_space_after_cast = false
+csharp_space_after_keywords_in_control_flow_statements = true
+csharp_space_between_method_declaration_parameter_list_parentheses = false
+csharp_space_between_method_call_parameter_list_parentheses = false
+csharp_space_before_colon_in_inheritance_clause = true
+csharp_space_after_colon_in_inheritance_clause = true
+csharp_space_around_binary_operators = before_and_after
+csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
+csharp_space_between_method_call_name_and_opening_parenthesis = false
+csharp_space_between_method_call_empty_parameter_list_parentheses = false
+
+# Wrapping preferences
+csharp_preserve_single_line_blocks = true
+csharp_preserve_single_line_statements = true
diff --git a/csharp/difference-of-squares/.exercism/config.json b/csharp/difference-of-squares/.exercism/config.json
new file mode 100644
index 0000000..fb4a2ae
--- /dev/null
+++ b/csharp/difference-of-squares/.exercism/config.json
@@ -0,0 +1,29 @@
+{
+ "blurb": "Find the difference between the square of the sum and the sum of the squares of the first N natural numbers.",
+ "authors": [
+ "mikecoop"
+ ],
+ "contributors": [
+ "balazsbotond",
+ "ErikSchierboom",
+ "felix91gr",
+ "j2jensen",
+ "jwood803",
+ "kytrinyx",
+ "robkeim",
+ "wolf99"
+ ],
+ "files": {
+ "solution": [
+ "DifferenceOfSquares.cs"
+ ],
+ "test": [
+ "DifferenceOfSquaresTests.cs"
+ ],
+ "example": [
+ ".meta/Example.cs"
+ ]
+ },
+ "source": "Problem 6 at Project Euler",
+ "source_url": "http://projecteuler.net/problem=6"
+}
diff --git a/csharp/difference-of-squares/.exercism/metadata.json b/csharp/difference-of-squares/.exercism/metadata.json
new file mode 100644
index 0000000..b7e0236
--- /dev/null
+++ b/csharp/difference-of-squares/.exercism/metadata.json
@@ -0,0 +1 @@
+{"track":"csharp","exercise":"difference-of-squares","id":"1b64bac5568349a7ab3fe1767ccee214","url":"https://exercism.org/tracks/csharp/exercises/difference-of-squares","handle":"benharri","is_requester":true,"auto_approve":false}
\ No newline at end of file
diff --git a/csharp/difference-of-squares/DifferenceOfSquares.cs b/csharp/difference-of-squares/DifferenceOfSquares.cs
new file mode 100644
index 0000000..eff2a37
--- /dev/null
+++ b/csharp/difference-of-squares/DifferenceOfSquares.cs
@@ -0,0 +1,16 @@
+using System.Linq;
+
+public static class DifferenceOfSquares
+{
+ public static int CalculateSquareOfSum(int max)
+ {
+ var sum = Enumerable.Range(1, max).Sum();
+ return sum * sum;
+ }
+
+ public static int CalculateSumOfSquares(int max) =>
+ Enumerable.Range(1, max).Sum(i => i * i);
+
+ public static int CalculateDifferenceOfSquares(int max) =>
+ CalculateSquareOfSum(max) - CalculateSumOfSquares(max);
+}
\ No newline at end of file
diff --git a/csharp/difference-of-squares/DifferenceOfSquares.csproj b/csharp/difference-of-squares/DifferenceOfSquares.csproj
new file mode 100644
index 0000000..bf6befb
--- /dev/null
+++ b/csharp/difference-of-squares/DifferenceOfSquares.csproj
@@ -0,0 +1,14 @@
+
+
+
+ net6.0
+
+
+
+
+
+
+
+
+
+
diff --git a/csharp/difference-of-squares/DifferenceOfSquaresTests.cs b/csharp/difference-of-squares/DifferenceOfSquaresTests.cs
new file mode 100644
index 0000000..b964472
--- /dev/null
+++ b/csharp/difference-of-squares/DifferenceOfSquaresTests.cs
@@ -0,0 +1,58 @@
+using Xunit;
+
+public class DifferenceOfSquaresTests
+{
+ [Fact]
+ public void Square_of_sum_1()
+ {
+ Assert.Equal(1, DifferenceOfSquares.CalculateSquareOfSum(1));
+ }
+
+ [Fact]
+ public void Square_of_sum_5()
+ {
+ Assert.Equal(225, DifferenceOfSquares.CalculateSquareOfSum(5));
+ }
+
+ [Fact]
+ public void Square_of_sum_100()
+ {
+ Assert.Equal(25502500, DifferenceOfSquares.CalculateSquareOfSum(100));
+ }
+
+ [Fact]
+ public void Sum_of_squares_1()
+ {
+ Assert.Equal(1, DifferenceOfSquares.CalculateSumOfSquares(1));
+ }
+
+ [Fact]
+ public void Sum_of_squares_5()
+ {
+ Assert.Equal(55, DifferenceOfSquares.CalculateSumOfSquares(5));
+ }
+
+ [Fact]
+ public void Sum_of_squares_100()
+ {
+ Assert.Equal(338350, DifferenceOfSquares.CalculateSumOfSquares(100));
+ }
+
+ [Fact]
+ public void Difference_of_squares_1()
+ {
+ Assert.Equal(0, DifferenceOfSquares.CalculateDifferenceOfSquares(1));
+ }
+
+ [Fact]
+ public void Difference_of_squares_5()
+ {
+ Assert.Equal(170, DifferenceOfSquares.CalculateDifferenceOfSquares(5));
+ }
+
+ [Fact]
+ public void Difference_of_squares_100()
+ {
+ Assert.Equal(25164150, DifferenceOfSquares.CalculateDifferenceOfSquares(100));
+ }
+}
\ No newline at end of file
diff --git a/csharp/difference-of-squares/HELP.md b/csharp/difference-of-squares/HELP.md
new file mode 100644
index 0000000..a13651c
--- /dev/null
+++ b/csharp/difference-of-squares/HELP.md
@@ -0,0 +1,39 @@
+# Help
+
+## Running the tests
+
+You can run the tests by opening a command prompt in the exercise's directory, and then running the [`dotnet test` command](https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-test)
+Alternatively, most IDE's have built-in support for running tests, including [Visual Studio](https://docs.microsoft.com/en-us/visualstudio/test/run-unit-tests-with-test-explorer), [Rider](https://www.jetbrains.com/help/rider/Unit_Testing_in_Solution.html) and [Visual Studio code](https://github.com/OmniSharp/omnisharp-vscode/wiki/How-to-run-and-debug-unit-tests).
+See the [tests page](https://exercism.io/tracks/csharp/tests) for more information.
+
+## Skipped tests
+
+Initially, only the first test will be enabled.
+This is to encourage you to solve the exercise one step at a time.
+Once you get the first test passing, remove the `Skip` property from the next test and work on getting that test passing.
+
+## Submitting your solution
+
+You can submit your solution using the `exercism submit DifferenceOfSquares.cs` command.
+This command will upload your solution to the Exercism website and print the solution page's URL.
+
+It's possible to submit an incomplete solution which allows you to:
+
+- See how others have completed the exercise
+- Request help from a mentor
+
+## Need to get help?
+
+If you'd like help solving the exercise, check the following pages:
+
+- The [C# track's documentation](https://exercism.org/docs/tracks/csharp)
+- [Exercism's support channel on gitter](https://gitter.im/exercism/support)
+- The [Frequently Asked Questions](https://exercism.org/docs/using/faqs)
+
+Should those resources not suffice, you could submit your (incomplete) solution to request mentoring.
+
+To get help if you're having trouble, you can use one of the following resources:
+
+- [Gitter](https://gitter.im/exercism/xcsharp) is Exercism C# track's Gitter room; go here to get support and ask questions related to the C# track.
+- [/r/csharp](https://www.reddit.com/r/csharp) is the C# subreddit.
+- [StackOverflow](http://stackoverflow.com/questions/tagged/c%23) can be used to search for your problem and see if it has been answered already. You can also ask and answer questions.
\ No newline at end of file
diff --git a/csharp/difference-of-squares/README.md b/csharp/difference-of-squares/README.md
new file mode 100644
index 0000000..dab7eac
--- /dev/null
+++ b/csharp/difference-of-squares/README.md
@@ -0,0 +1,47 @@
+# Difference Of Squares
+
+Welcome to Difference Of Squares on Exercism's C# Track.
+If you need help running the tests or submitting your code, check out `HELP.md`.
+
+## Instructions
+
+Find the difference between the square of the sum and the sum of the squares of the first N natural numbers.
+
+The square of the sum of the first ten natural numbers is
+(1 + 2 + ... + 10)² = 55² = 3025.
+
+The sum of the squares of the first ten natural numbers is
+1² + 2² + ... + 10² = 385.
+
+Hence the difference between the square of the sum of the first
+ten natural numbers and the sum of the squares of the first ten
+natural numbers is 3025 - 385 = 2640.
+
+You are not expected to discover an efficient solution to this yourself from
+first principles; research is allowed, indeed, encouraged. Finding the best
+algorithm for the problem is a key skill in software engineering.
+
+This exercise requires you to process a collection of data. You can simplify your code by using LINQ (Language Integrated Query).
+For more information, see [this page]
+(https://docs.microsoft.com/en-us/dotnet/articles/standard/using-linq).
+
+## Source
+
+### Created by
+
+- @mikecoop
+
+### Contributed to by
+
+- @balazsbotond
+- @ErikSchierboom
+- @felix91gr
+- @j2jensen
+- @jwood803
+- @kytrinyx
+- @robkeim
+- @wolf99
+
+### Based on
+
+Problem 6 at Project Euler - http://projecteuler.net/problem=6
\ No newline at end of file
diff --git a/csharp/flatten-array/.editorconfig b/csharp/flatten-array/.editorconfig
new file mode 100644
index 0000000..72a68a3
--- /dev/null
+++ b/csharp/flatten-array/.editorconfig
@@ -0,0 +1,141 @@
+###############################
+# Core EditorConfig Options #
+###############################
+
+; This file is for unifying the coding style for different editors and IDEs.
+; More information at:
+; https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference?view=vs-2017
+; https://docs.microsoft.com/en-us/visualstudio/ide/create-portable-custom-editor-options?view=vs-2017
+
+root = true
+
+[*]
+indent_style = space
+
+[FlattenArray.cs]
+indent_size = 4
+
+###############################
+# .NET Coding Conventions #
+###############################
+
+# Organize usings
+dotnet_sort_system_directives_first = true
+dotnet_separate_import_directive_groups = true
+
+# this. preferences
+dotnet_style_qualification_for_field = false:suggestion
+dotnet_style_qualification_for_property = false:suggestion
+dotnet_style_qualification_for_method = false:suggestion
+dotnet_style_qualification_for_event = false:suggestion
+
+# Language keywords vs BCL types preferences
+dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion
+dotnet_style_predefined_type_for_member_access = true:suggestion
+
+# Parentheses preferences
+dotnet_style_parentheses_in_arithmetic_binary_operators = never_if_unnecessary:none
+dotnet_style_parentheses_in_relational_binary_operators = never_if_unnecessary:none
+dotnet_style_parentheses_in_other_binary_operators = never_if_unnecessary:none
+dotnet_style_parentheses_in_other_operators = never_if_unnecessary:suggestion
+
+# Modifier preferences
+dotnet_style_require_accessibility_modifiers = always:suggestion
+dotnet_style_readonly_field = true:suggestion
+
+# Expression-level preferences
+dotnet_style_object_initializer = true:suggestion
+dotnet_style_collection_initializer = true:suggestion
+dotnet_style_explicit_tuple_names = true:suggestion
+dotnet_style_prefer_inferred_tuple_names = true:suggestion
+dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
+dotnet_style_prefer_auto_properties = true:suggestion
+dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion
+dotnet_style_prefer_conditional_expression_over_assignment = true:suggestion
+dotnet_style_prefer_conditional_expression_over_return = true:suggestion
+dotnet_style_coalesce_expression = true:suggestion
+dotnet_style_null_propagation = true:suggestion
+
+###############################
+# Naming Conventions #
+###############################
+
+# Style Definitions
+dotnet_naming_style.pascal_case_style.capitalization = pascal_case
+
+# Use PascalCase for constant fields
+dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion
+dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields
+dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style
+dotnet_naming_symbols.constant_fields.applicable_kinds = field
+dotnet_naming_symbols.constant_fields.applicable_accessibilities = *
+dotnet_naming_symbols.constant_fields.required_modifiers = const
+
+###############################
+# C# Code Style Rules #
+###############################
+
+# var preferences
+csharp_style_var_for_built_in_types = true:none
+csharp_style_var_when_type_is_apparent = true:none
+csharp_style_var_elsewhere = true:none
+
+# Expression-bodied members
+csharp_style_expression_bodied_methods = true:suggestion
+csharp_style_expression_bodied_constructors = true:suggestion
+csharp_style_expression_bodied_operators = true:suggestion
+csharp_style_expression_bodied_properties = true:suggestion
+csharp_style_expression_bodied_indexers = true:suggestion
+csharp_style_expression_bodied_accessors = true:suggestion
+
+# Pattern-matching preferences
+csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion
+csharp_style_pattern_matching_over_as_with_null_check = true:suggestion
+
+# Null-checking preferences
+csharp_style_throw_expression = true:suggestion
+csharp_style_conditional_delegate_call = true:suggestion
+
+# Modifier preferences
+csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:suggestion
+
+# Expression-level preferences
+csharp_prefer_braces = true:none
+csharp_prefer_simple_default_expression = true:suggestion
+csharp_style_deconstructed_variable_declaration = true:suggestion
+csharp_style_pattern_local_over_anonymous_function = true:suggestion
+csharp_style_inlined_variable_declaration = true:suggestion
+
+###############################
+# C# Formatting Rules #
+###############################
+
+# New line preferences
+csharp_new_line_before_open_brace = all
+csharp_new_line_before_else = true
+csharp_new_line_before_catch = true
+csharp_new_line_before_finally = true
+csharp_new_line_before_members_in_object_initializers = false
+csharp_new_line_before_members_in_anonymous_types = false
+csharp_new_line_between_query_expression_clauses = true
+
+# Indentation preferences
+csharp_indent_case_contents = true
+csharp_indent_switch_labels = true
+csharp_indent_labels = flush_left
+
+# Space preferences
+csharp_space_after_cast = false
+csharp_space_after_keywords_in_control_flow_statements = true
+csharp_space_between_method_declaration_parameter_list_parentheses = false
+csharp_space_between_method_call_parameter_list_parentheses = false
+csharp_space_before_colon_in_inheritance_clause = true
+csharp_space_after_colon_in_inheritance_clause = true
+csharp_space_around_binary_operators = before_and_after
+csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
+csharp_space_between_method_call_name_and_opening_parenthesis = false
+csharp_space_between_method_call_empty_parameter_list_parentheses = false
+
+# Wrapping preferences
+csharp_preserve_single_line_blocks = true
+csharp_preserve_single_line_statements = true
diff --git a/csharp/flatten-array/.exercism/config.json b/csharp/flatten-array/.exercism/config.json
new file mode 100644
index 0000000..ea2834c
--- /dev/null
+++ b/csharp/flatten-array/.exercism/config.json
@@ -0,0 +1,25 @@
+{
+ "blurb": "Take a nested list and return a single list with all values except nil/null",
+ "authors": [
+ "ErikSchierboom"
+ ],
+ "contributors": [
+ "felix91gr",
+ "j2jensen",
+ "robkeim",
+ "wolf99"
+ ],
+ "files": {
+ "solution": [
+ "FlattenArray.cs"
+ ],
+ "test": [
+ "FlattenArrayTests.cs"
+ ],
+ "example": [
+ ".meta/Example.cs"
+ ]
+ },
+ "source": "Interview Question",
+ "source_url": "https://reference.wolfram.com/language/ref/Flatten.html"
+}
diff --git a/csharp/flatten-array/.exercism/metadata.json b/csharp/flatten-array/.exercism/metadata.json
new file mode 100644
index 0000000..678822d
--- /dev/null
+++ b/csharp/flatten-array/.exercism/metadata.json
@@ -0,0 +1 @@
+{"track":"csharp","exercise":"flatten-array","id":"f9c4a3fffbab4276bc9e1638983045a9","url":"https://exercism.org/tracks/csharp/exercises/flatten-array","handle":"benharri","is_requester":true,"auto_approve":false}
\ No newline at end of file
diff --git a/csharp/flatten-array/FlattenArray.cs b/csharp/flatten-array/FlattenArray.cs
new file mode 100644
index 0000000..be2e83a
--- /dev/null
+++ b/csharp/flatten-array/FlattenArray.cs
@@ -0,0 +1,17 @@
+using System.Collections;
+
+public static class FlattenArray
+{
+ public static IEnumerable Flatten(IEnumerable input)
+ {
+ foreach (var element in input)
+ {
+ if (element is null) continue;
+ if (element is IEnumerable)
+ foreach (var nestedElement in Flatten(element as IEnumerable))
+ yield return nestedElement;
+ else
+ yield return element;
+ }
+ }
+}
\ No newline at end of file
diff --git a/csharp/flatten-array/FlattenArray.csproj b/csharp/flatten-array/FlattenArray.csproj
new file mode 100644
index 0000000..bf6befb
--- /dev/null
+++ b/csharp/flatten-array/FlattenArray.csproj
@@ -0,0 +1,14 @@
+
+
+
+ net6.0
+
+
+
+
+
+
+
+
+
+
diff --git a/csharp/flatten-array/FlattenArrayTests.cs b/csharp/flatten-array/FlattenArrayTests.cs
new file mode 100644
index 0000000..ee5b9a8
--- /dev/null
+++ b/csharp/flatten-array/FlattenArrayTests.cs
@@ -0,0 +1,86 @@
+using Xunit;
+
+public class FlattenArrayTests
+{
+ [Fact]
+ public void No_nesting()
+ {
+ var array = new object[]
+ {
+ 0,
+ 1,
+ 2
+ };
+ var expected = new[] { 0, 1, 2 };
+ Assert.Equal(expected, FlattenArray.Flatten(array));
+ }
+
+ [Fact]
+ public void Flattens_array_with_just_integers_present()
+ {
+ var array = new object[]
+ {
+ 1,
+ new object[] { 2, 3, 4, 5, 6, 7 },
+ 8
+ };
+ var expected = new[] { 1, 2, 3, 4, 5, 6, 7, 8 };
+ Assert.Equal(expected, FlattenArray.Flatten(array));
+ }
+
+ [Fact]
+ public void Number_5_level_nesting()
+ {
+ var array = new object[]
+ {
+ 0,
+ 2,
+ new object[] { new object[] { 2, 3 }, 8, 100, 4, new object[] { new object[] { new object[] { 50 } } } },
+ -2
+ };
+ var expected = new[] { 0, 2, 2, 3, 8, 100, 4, 50, -2 };
+ Assert.Equal(expected, FlattenArray.Flatten(array));
+ }
+
+ [Fact]
+ public void Number_6_level_nesting()
+ {
+ var array = new object[]
+ {
+ 1,
+ new object[] { 2, new object[] { new object[] { 3 } }, new object[] { 4, new object[] { new object[] { 5 } } }, 6, 7 },
+ 8
+ };
+ var expected = new[] { 1, 2, 3, 4, 5, 6, 7, 8 };
+ Assert.Equal(expected, FlattenArray.Flatten(array));
+ }
+
+ [Fact]
+ public void Number_6_level_nest_list_with_null_values()
+ {
+ var array = new object[]
+ {
+ 0,
+ 2,
+ new object[] { new object[] { 2, 3 }, 8, new object[] { new object[] { 100 } }, null, new object[] { new object[] { null } } },
+ -2
+ };
+ var expected = new[] { 0, 2, 2, 3, 8, 100, -2 };
+ Assert.Equal(expected, FlattenArray.Flatten(array));
+ }
+
+ [Fact]
+ public void All_values_in_nested_list_are_null()
+ {
+ var array = new object[]
+ {
+ null,
+ new object[] { new object[] { new object[] { null } } },
+ null,
+ null,
+ new object[] { new object[] { null, null }, null },
+ null
+ };
+ Assert.Empty(FlattenArray.Flatten(array));
+ }
+}
\ No newline at end of file
diff --git a/csharp/flatten-array/HELP.md b/csharp/flatten-array/HELP.md
new file mode 100644
index 0000000..41143d6
--- /dev/null
+++ b/csharp/flatten-array/HELP.md
@@ -0,0 +1,39 @@
+# Help
+
+## Running the tests
+
+You can run the tests by opening a command prompt in the exercise's directory, and then running the [`dotnet test` command](https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-test)
+Alternatively, most IDE's have built-in support for running tests, including [Visual Studio](https://docs.microsoft.com/en-us/visualstudio/test/run-unit-tests-with-test-explorer), [Rider](https://www.jetbrains.com/help/rider/Unit_Testing_in_Solution.html) and [Visual Studio code](https://github.com/OmniSharp/omnisharp-vscode/wiki/How-to-run-and-debug-unit-tests).
+See the [tests page](https://exercism.io/tracks/csharp/tests) for more information.
+
+## Skipped tests
+
+Initially, only the first test will be enabled.
+This is to encourage you to solve the exercise one step at a time.
+Once you get the first test passing, remove the `Skip` property from the next test and work on getting that test passing.
+
+## Submitting your solution
+
+You can submit your solution using the `exercism submit FlattenArray.cs` command.
+This command will upload your solution to the Exercism website and print the solution page's URL.
+
+It's possible to submit an incomplete solution which allows you to:
+
+- See how others have completed the exercise
+- Request help from a mentor
+
+## Need to get help?
+
+If you'd like help solving the exercise, check the following pages:
+
+- The [C# track's documentation](https://exercism.org/docs/tracks/csharp)
+- [Exercism's support channel on gitter](https://gitter.im/exercism/support)
+- The [Frequently Asked Questions](https://exercism.org/docs/using/faqs)
+
+Should those resources not suffice, you could submit your (incomplete) solution to request mentoring.
+
+To get help if you're having trouble, you can use one of the following resources:
+
+- [Gitter](https://gitter.im/exercism/xcsharp) is Exercism C# track's Gitter room; go here to get support and ask questions related to the C# track.
+- [/r/csharp](https://www.reddit.com/r/csharp) is the C# subreddit.
+- [StackOverflow](http://stackoverflow.com/questions/tagged/c%23) can be used to search for your problem and see if it has been answered already. You can also ask and answer questions.
\ No newline at end of file
diff --git a/csharp/flatten-array/README.md b/csharp/flatten-array/README.md
new file mode 100644
index 0000000..4b7412f
--- /dev/null
+++ b/csharp/flatten-array/README.md
@@ -0,0 +1,33 @@
+# Flatten Array
+
+Welcome to Flatten Array on Exercism's C# Track.
+If you need help running the tests or submitting your code, check out `HELP.md`.
+
+## Instructions
+
+Take a nested list and return a single flattened list with all values except nil/null.
+
+The challenge is to write a function that accepts an arbitrarily-deep nested list-like structure and returns a flattened structure without any nil/null values.
+
+For Example
+
+input: [1,[2,3,null,4],[null],5]
+
+output: [1,2,3,4,5]
+
+## Source
+
+### Created by
+
+- @ErikSchierboom
+
+### Contributed to by
+
+- @felix91gr
+- @j2jensen
+- @robkeim
+- @wolf99
+
+### Based on
+
+Interview Question - https://reference.wolfram.com/language/ref/Flatten.html
\ No newline at end of file
diff --git a/csharp/protein-translation/.editorconfig b/csharp/protein-translation/.editorconfig
new file mode 100644
index 0000000..8e51769
--- /dev/null
+++ b/csharp/protein-translation/.editorconfig
@@ -0,0 +1,141 @@
+###############################
+# Core EditorConfig Options #
+###############################
+
+; This file is for unifying the coding style for different editors and IDEs.
+; More information at:
+; https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference?view=vs-2017
+; https://docs.microsoft.com/en-us/visualstudio/ide/create-portable-custom-editor-options?view=vs-2017
+
+root = true
+
+[*]
+indent_style = space
+
+[ProteinTranslation.cs]
+indent_size = 4
+
+###############################
+# .NET Coding Conventions #
+###############################
+
+# Organize usings
+dotnet_sort_system_directives_first = true
+dotnet_separate_import_directive_groups = true
+
+# this. preferences
+dotnet_style_qualification_for_field = false:suggestion
+dotnet_style_qualification_for_property = false:suggestion
+dotnet_style_qualification_for_method = false:suggestion
+dotnet_style_qualification_for_event = false:suggestion
+
+# Language keywords vs BCL types preferences
+dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion
+dotnet_style_predefined_type_for_member_access = true:suggestion
+
+# Parentheses preferences
+dotnet_style_parentheses_in_arithmetic_binary_operators = never_if_unnecessary:none
+dotnet_style_parentheses_in_relational_binary_operators = never_if_unnecessary:none
+dotnet_style_parentheses_in_other_binary_operators = never_if_unnecessary:none
+dotnet_style_parentheses_in_other_operators = never_if_unnecessary:suggestion
+
+# Modifier preferences
+dotnet_style_require_accessibility_modifiers = always:suggestion
+dotnet_style_readonly_field = true:suggestion
+
+# Expression-level preferences
+dotnet_style_object_initializer = true:suggestion
+dotnet_style_collection_initializer = true:suggestion
+dotnet_style_explicit_tuple_names = true:suggestion
+dotnet_style_prefer_inferred_tuple_names = true:suggestion
+dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
+dotnet_style_prefer_auto_properties = true:suggestion
+dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion
+dotnet_style_prefer_conditional_expression_over_assignment = true:suggestion
+dotnet_style_prefer_conditional_expression_over_return = true:suggestion
+dotnet_style_coalesce_expression = true:suggestion
+dotnet_style_null_propagation = true:suggestion
+
+###############################
+# Naming Conventions #
+###############################
+
+# Style Definitions
+dotnet_naming_style.pascal_case_style.capitalization = pascal_case
+
+# Use PascalCase for constant fields
+dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion
+dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields
+dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style
+dotnet_naming_symbols.constant_fields.applicable_kinds = field
+dotnet_naming_symbols.constant_fields.applicable_accessibilities = *
+dotnet_naming_symbols.constant_fields.required_modifiers = const
+
+###############################
+# C# Code Style Rules #
+###############################
+
+# var preferences
+csharp_style_var_for_built_in_types = true:none
+csharp_style_var_when_type_is_apparent = true:none
+csharp_style_var_elsewhere = true:none
+
+# Expression-bodied members
+csharp_style_expression_bodied_methods = true:suggestion
+csharp_style_expression_bodied_constructors = true:suggestion
+csharp_style_expression_bodied_operators = true:suggestion
+csharp_style_expression_bodied_properties = true:suggestion
+csharp_style_expression_bodied_indexers = true:suggestion
+csharp_style_expression_bodied_accessors = true:suggestion
+
+# Pattern-matching preferences
+csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion
+csharp_style_pattern_matching_over_as_with_null_check = true:suggestion
+
+# Null-checking preferences
+csharp_style_throw_expression = true:suggestion
+csharp_style_conditional_delegate_call = true:suggestion
+
+# Modifier preferences
+csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:suggestion
+
+# Expression-level preferences
+csharp_prefer_braces = true:none
+csharp_prefer_simple_default_expression = true:suggestion
+csharp_style_deconstructed_variable_declaration = true:suggestion
+csharp_style_pattern_local_over_anonymous_function = true:suggestion
+csharp_style_inlined_variable_declaration = true:suggestion
+
+###############################
+# C# Formatting Rules #
+###############################
+
+# New line preferences
+csharp_new_line_before_open_brace = all
+csharp_new_line_before_else = true
+csharp_new_line_before_catch = true
+csharp_new_line_before_finally = true
+csharp_new_line_before_members_in_object_initializers = false
+csharp_new_line_before_members_in_anonymous_types = false
+csharp_new_line_between_query_expression_clauses = true
+
+# Indentation preferences
+csharp_indent_case_contents = true
+csharp_indent_switch_labels = true
+csharp_indent_labels = flush_left
+
+# Space preferences
+csharp_space_after_cast = false
+csharp_space_after_keywords_in_control_flow_statements = true
+csharp_space_between_method_declaration_parameter_list_parentheses = false
+csharp_space_between_method_call_parameter_list_parentheses = false
+csharp_space_before_colon_in_inheritance_clause = true
+csharp_space_after_colon_in_inheritance_clause = true
+csharp_space_around_binary_operators = before_and_after
+csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
+csharp_space_between_method_call_name_and_opening_parenthesis = false
+csharp_space_between_method_call_empty_parameter_list_parentheses = false
+
+# Wrapping preferences
+csharp_preserve_single_line_blocks = true
+csharp_preserve_single_line_statements = true
diff --git a/csharp/protein-translation/.exercism/config.json b/csharp/protein-translation/.exercism/config.json
new file mode 100644
index 0000000..6a79546
--- /dev/null
+++ b/csharp/protein-translation/.exercism/config.json
@@ -0,0 +1,23 @@
+{
+ "blurb": "Translate RNA sequences into proteins.",
+ "authors": [
+ "robkeim"
+ ],
+ "contributors": [
+ "ErikSchierboom",
+ "j2jensen",
+ "wolf99"
+ ],
+ "files": {
+ "solution": [
+ "ProteinTranslation.cs"
+ ],
+ "test": [
+ "ProteinTranslationTests.cs"
+ ],
+ "example": [
+ ".meta/Example.cs"
+ ]
+ },
+ "source": "Tyler Long"
+}
diff --git a/csharp/protein-translation/.exercism/metadata.json b/csharp/protein-translation/.exercism/metadata.json
new file mode 100644
index 0000000..a2b0636
--- /dev/null
+++ b/csharp/protein-translation/.exercism/metadata.json
@@ -0,0 +1 @@
+{"track":"csharp","exercise":"protein-translation","id":"998e522961fd47f9880d643ee8216abc","url":"https://exercism.org/tracks/csharp/exercises/protein-translation","handle":"benharri","is_requester":true,"auto_approve":false}
\ No newline at end of file
diff --git a/csharp/protein-translation/HELP.md b/csharp/protein-translation/HELP.md
new file mode 100644
index 0000000..a3d7262
--- /dev/null
+++ b/csharp/protein-translation/HELP.md
@@ -0,0 +1,39 @@
+# Help
+
+## Running the tests
+
+You can run the tests by opening a command prompt in the exercise's directory, and then running the [`dotnet test` command](https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-test)
+Alternatively, most IDE's have built-in support for running tests, including [Visual Studio](https://docs.microsoft.com/en-us/visualstudio/test/run-unit-tests-with-test-explorer), [Rider](https://www.jetbrains.com/help/rider/Unit_Testing_in_Solution.html) and [Visual Studio code](https://github.com/OmniSharp/omnisharp-vscode/wiki/How-to-run-and-debug-unit-tests).
+See the [tests page](https://exercism.io/tracks/csharp/tests) for more information.
+
+## Skipped tests
+
+Initially, only the first test will be enabled.
+This is to encourage you to solve the exercise one step at a time.
+Once you get the first test passing, remove the `Skip` property from the next test and work on getting that test passing.
+
+## Submitting your solution
+
+You can submit your solution using the `exercism submit ProteinTranslation.cs` command.
+This command will upload your solution to the Exercism website and print the solution page's URL.
+
+It's possible to submit an incomplete solution which allows you to:
+
+- See how others have completed the exercise
+- Request help from a mentor
+
+## Need to get help?
+
+If you'd like help solving the exercise, check the following pages:
+
+- The [C# track's documentation](https://exercism.org/docs/tracks/csharp)
+- [Exercism's support channel on gitter](https://gitter.im/exercism/support)
+- The [Frequently Asked Questions](https://exercism.org/docs/using/faqs)
+
+Should those resources not suffice, you could submit your (incomplete) solution to request mentoring.
+
+To get help if you're having trouble, you can use one of the following resources:
+
+- [Gitter](https://gitter.im/exercism/xcsharp) is Exercism C# track's Gitter room; go here to get support and ask questions related to the C# track.
+- [/r/csharp](https://www.reddit.com/r/csharp) is the C# subreddit.
+- [StackOverflow](http://stackoverflow.com/questions/tagged/c%23) can be used to search for your problem and see if it has been answered already. You can also ask and answer questions.
\ No newline at end of file
diff --git a/csharp/protein-translation/ProteinTranslation.cs b/csharp/protein-translation/ProteinTranslation.cs
new file mode 100644
index 0000000..911b6f5
--- /dev/null
+++ b/csharp/protein-translation/ProteinTranslation.cs
@@ -0,0 +1,24 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+public static class ProteinTranslation
+{
+ public static string[] Proteins(string strand) =>
+ strand.Chunk(3).Select(p => p switch
+ {
+ "AUG" => "Methionine",
+ "UUU" or "UUC" => "Phenylalanine",
+ "UUA" or "UUG" => "Leucine",
+ "UCU" or "UCC" or "UCA" or "UCG" => "Serine",
+ "UAU" or "UAC" => "Tyrosine",
+ "UGU" or "UGC" => "Cysteine",
+ "UGG" => "Tryptophan",
+ "UAA" or "UAG" or "UGA" => "",
+ _ => throw new ArgumentOutOfRangeException(nameof(strand))
+ }).TakeWhile(p => p != "").ToArray();
+
+ public static IEnumerable Chunk(this string s, int chunkSize) =>
+ Enumerable.Range(0, s.Length / chunkSize)
+ .Select(i => s.Substring(i * chunkSize, chunkSize));
+}
diff --git a/csharp/protein-translation/ProteinTranslation.csproj b/csharp/protein-translation/ProteinTranslation.csproj
new file mode 100644
index 0000000..832ffac
--- /dev/null
+++ b/csharp/protein-translation/ProteinTranslation.csproj
@@ -0,0 +1,14 @@
+
+
+
+ net6.0
+
+
+
+
+
+
+
+
+
+
diff --git a/csharp/protein-translation/ProteinTranslationTests.cs b/csharp/protein-translation/ProteinTranslationTests.cs
new file mode 100644
index 0000000..bf6e248
--- /dev/null
+++ b/csharp/protein-translation/ProteinTranslationTests.cs
@@ -0,0 +1,142 @@
+using Xunit;
+
+public class ProteinTranslationTests
+{
+ [Fact]
+ public void Methionine_rna_sequence()
+ {
+ Assert.Equal(new[] { "Methionine" }, ProteinTranslation.Proteins("AUG"));
+ }
+
+ [Fact]
+ public void Phenylalanine_rna_sequence_1()
+ {
+ Assert.Equal(new[] { "Phenylalanine" }, ProteinTranslation.Proteins("UUU"));
+ }
+
+ [Fact]
+ public void Phenylalanine_rna_sequence_2()
+ {
+ Assert.Equal(new[] { "Phenylalanine" }, ProteinTranslation.Proteins("UUC"));
+ }
+
+ [Fact]
+ public void Leucine_rna_sequence_1()
+ {
+ Assert.Equal(new[] { "Leucine" }, ProteinTranslation.Proteins("UUA"));
+ }
+
+ [Fact]
+ public void Leucine_rna_sequence_2()
+ {
+ Assert.Equal(new[] { "Leucine" }, ProteinTranslation.Proteins("UUG"));
+ }
+
+ [Fact]
+ public void Serine_rna_sequence_1()
+ {
+ Assert.Equal(new[] { "Serine" }, ProteinTranslation.Proteins("UCU"));
+ }
+
+ [Fact]
+ public void Serine_rna_sequence_2()
+ {
+ Assert.Equal(new[] { "Serine" }, ProteinTranslation.Proteins("UCC"));
+ }
+
+ [Fact]
+ public void Serine_rna_sequence_3()
+ {
+ Assert.Equal(new[] { "Serine" }, ProteinTranslation.Proteins("UCA"));
+ }
+
+ [Fact]
+ public void Serine_rna_sequence_4()
+ {
+ Assert.Equal(new[] { "Serine" }, ProteinTranslation.Proteins("UCG"));
+ }
+
+ [Fact]
+ public void Tyrosine_rna_sequence_1()
+ {
+ Assert.Equal(new[] { "Tyrosine" }, ProteinTranslation.Proteins("UAU"));
+ }
+
+ [Fact]
+ public void Tyrosine_rna_sequence_2()
+ {
+ Assert.Equal(new[] { "Tyrosine" }, ProteinTranslation.Proteins("UAC"));
+ }
+
+ [Fact]
+ public void Cysteine_rna_sequence_1()
+ {
+ Assert.Equal(new[] { "Cysteine" }, ProteinTranslation.Proteins("UGU"));
+ }
+
+ [Fact]
+ public void Cysteine_rna_sequence_2()
+ {
+ Assert.Equal(new[] { "Cysteine" }, ProteinTranslation.Proteins("UGC"));
+ }
+
+ [Fact]
+ public void Tryptophan_rna_sequence()
+ {
+ Assert.Equal(new[] { "Tryptophan" }, ProteinTranslation.Proteins("UGG"));
+ }
+
+ [Fact]
+ public void Stop_codon_rna_sequence_1()
+ {
+ Assert.Empty(ProteinTranslation.Proteins("UAA"));
+ }
+
+ [Fact]
+ public void Stop_codon_rna_sequence_2()
+ {
+ Assert.Empty(ProteinTranslation.Proteins("UAG"));
+ }
+
+ [Fact]
+ public void Stop_codon_rna_sequence_3()
+ {
+ Assert.Empty(ProteinTranslation.Proteins("UGA"));
+ }
+
+ [Fact]
+ public void Translate_rna_strand_into_correct_protein_list()
+ {
+ Assert.Equal(new[] { "Methionine", "Phenylalanine", "Tryptophan" }, ProteinTranslation.Proteins("AUGUUUUGG"));
+ }
+
+ [Fact]
+ public void Translation_stops_if_stop_codon_at_beginning_of_sequence()
+ {
+ Assert.Empty(ProteinTranslation.Proteins("UAGUGG"));
+ }
+
+ [Fact]
+ public void Translation_stops_if_stop_codon_at_end_of_two_codon_sequence()
+ {
+ Assert.Equal(new[] { "Tryptophan" }, ProteinTranslation.Proteins("UGGUAG"));
+ }
+
+ [Fact]
+ public void Translation_stops_if_stop_codon_at_end_of_three_codon_sequence()
+ {
+ Assert.Equal(new[] { "Methionine", "Phenylalanine" }, ProteinTranslation.Proteins("AUGUUUUAA"));
+ }
+
+ [Fact]
+ public void Translation_stops_if_stop_codon_in_middle_of_three_codon_sequence()
+ {
+ Assert.Equal(new[] { "Tryptophan" }, ProteinTranslation.Proteins("UGGUAGUGG"));
+ }
+
+ [Fact]
+ public void Translation_stops_if_stop_codon_in_middle_of_six_codon_sequence()
+ {
+ Assert.Equal(new[] { "Tryptophan", "Cysteine", "Tyrosine" }, ProteinTranslation.Proteins("UGGUGUUAUUAAUGGUUU"));
+ }
+}
\ No newline at end of file
diff --git a/csharp/protein-translation/README.md b/csharp/protein-translation/README.md
new file mode 100644
index 0000000..0fd82ec
--- /dev/null
+++ b/csharp/protein-translation/README.md
@@ -0,0 +1,63 @@
+# Protein Translation
+
+Welcome to Protein Translation on Exercism's C# Track.
+If you need help running the tests or submitting your code, check out `HELP.md`.
+
+## Instructions
+
+Translate RNA sequences into proteins.
+
+RNA can be broken into three nucleotide sequences called codons, and then translated to a polypeptide like so:
+
+RNA: `"AUGUUUUCU"` => translates to
+
+Codons: `"AUG", "UUU", "UCU"`
+=> which become a polypeptide with the following sequence =>
+
+Protein: `"Methionine", "Phenylalanine", "Serine"`
+
+There are 64 codons which in turn correspond to 20 amino acids; however, all of the codon sequences and resulting amino acids are not important in this exercise. If it works for one codon, the program should work for all of them.
+However, feel free to expand the list in the test suite to include them all.
+
+There are also three terminating codons (also known as 'STOP' codons); if any of these codons are encountered (by the ribosome), all translation ends and the protein is terminated.
+
+All subsequent codons after are ignored, like this:
+
+RNA: `"AUGUUUUCUUAAAUG"` =>
+
+Codons: `"AUG", "UUU", "UCU", "UAA", "AUG"` =>
+
+Protein: `"Methionine", "Phenylalanine", "Serine"`
+
+Note the stop codon `"UAA"` terminates the translation and the final methionine is not translated into the protein sequence.
+
+Below are the codons and resulting Amino Acids needed for the exercise.
+
+Codon | Protein
+:--- | :---
+AUG | Methionine
+UUU, UUC | Phenylalanine
+UUA, UUG | Leucine
+UCU, UCC, UCA, UCG | Serine
+UAU, UAC | Tyrosine
+UGU, UGC | Cysteine
+UGG | Tryptophan
+UAA, UAG, UGA | STOP
+
+Learn more about [protein translation on Wikipedia](http://en.wikipedia.org/wiki/Translation_(biology))
+
+## Source
+
+### Created by
+
+- @robkeim
+
+### Contributed to by
+
+- @ErikSchierboom
+- @j2jensen
+- @wolf99
+
+### Based on
+
+Tyler Long
\ No newline at end of file
diff --git a/csharp/proverb/.editorconfig b/csharp/proverb/.editorconfig
new file mode 100644
index 0000000..38f993d
--- /dev/null
+++ b/csharp/proverb/.editorconfig
@@ -0,0 +1,141 @@
+###############################
+# Core EditorConfig Options #
+###############################
+
+; This file is for unifying the coding style for different editors and IDEs.
+; More information at:
+; https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference?view=vs-2017
+; https://docs.microsoft.com/en-us/visualstudio/ide/create-portable-custom-editor-options?view=vs-2017
+
+root = true
+
+[*]
+indent_style = space
+
+[Proverb.cs]
+indent_size = 4
+
+###############################
+# .NET Coding Conventions #
+###############################
+
+# Organize usings
+dotnet_sort_system_directives_first = true
+dotnet_separate_import_directive_groups = true
+
+# this. preferences
+dotnet_style_qualification_for_field = false:suggestion
+dotnet_style_qualification_for_property = false:suggestion
+dotnet_style_qualification_for_method = false:suggestion
+dotnet_style_qualification_for_event = false:suggestion
+
+# Language keywords vs BCL types preferences
+dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion
+dotnet_style_predefined_type_for_member_access = true:suggestion
+
+# Parentheses preferences
+dotnet_style_parentheses_in_arithmetic_binary_operators = never_if_unnecessary:none
+dotnet_style_parentheses_in_relational_binary_operators = never_if_unnecessary:none
+dotnet_style_parentheses_in_other_binary_operators = never_if_unnecessary:none
+dotnet_style_parentheses_in_other_operators = never_if_unnecessary:suggestion
+
+# Modifier preferences
+dotnet_style_require_accessibility_modifiers = always:suggestion
+dotnet_style_readonly_field = true:suggestion
+
+# Expression-level preferences
+dotnet_style_object_initializer = true:suggestion
+dotnet_style_collection_initializer = true:suggestion
+dotnet_style_explicit_tuple_names = true:suggestion
+dotnet_style_prefer_inferred_tuple_names = true:suggestion
+dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
+dotnet_style_prefer_auto_properties = true:suggestion
+dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion
+dotnet_style_prefer_conditional_expression_over_assignment = true:suggestion
+dotnet_style_prefer_conditional_expression_over_return = true:suggestion
+dotnet_style_coalesce_expression = true:suggestion
+dotnet_style_null_propagation = true:suggestion
+
+###############################
+# Naming Conventions #
+###############################
+
+# Style Definitions
+dotnet_naming_style.pascal_case_style.capitalization = pascal_case
+
+# Use PascalCase for constant fields
+dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion
+dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields
+dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style
+dotnet_naming_symbols.constant_fields.applicable_kinds = field
+dotnet_naming_symbols.constant_fields.applicable_accessibilities = *
+dotnet_naming_symbols.constant_fields.required_modifiers = const
+
+###############################
+# C# Code Style Rules #
+###############################
+
+# var preferences
+csharp_style_var_for_built_in_types = true:none
+csharp_style_var_when_type_is_apparent = true:none
+csharp_style_var_elsewhere = true:none
+
+# Expression-bodied members
+csharp_style_expression_bodied_methods = true:suggestion
+csharp_style_expression_bodied_constructors = true:suggestion
+csharp_style_expression_bodied_operators = true:suggestion
+csharp_style_expression_bodied_properties = true:suggestion
+csharp_style_expression_bodied_indexers = true:suggestion
+csharp_style_expression_bodied_accessors = true:suggestion
+
+# Pattern-matching preferences
+csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion
+csharp_style_pattern_matching_over_as_with_null_check = true:suggestion
+
+# Null-checking preferences
+csharp_style_throw_expression = true:suggestion
+csharp_style_conditional_delegate_call = true:suggestion
+
+# Modifier preferences
+csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:suggestion
+
+# Expression-level preferences
+csharp_prefer_braces = true:none
+csharp_prefer_simple_default_expression = true:suggestion
+csharp_style_deconstructed_variable_declaration = true:suggestion
+csharp_style_pattern_local_over_anonymous_function = true:suggestion
+csharp_style_inlined_variable_declaration = true:suggestion
+
+###############################
+# C# Formatting Rules #
+###############################
+
+# New line preferences
+csharp_new_line_before_open_brace = all
+csharp_new_line_before_else = true
+csharp_new_line_before_catch = true
+csharp_new_line_before_finally = true
+csharp_new_line_before_members_in_object_initializers = false
+csharp_new_line_before_members_in_anonymous_types = false
+csharp_new_line_between_query_expression_clauses = true
+
+# Indentation preferences
+csharp_indent_case_contents = true
+csharp_indent_switch_labels = true
+csharp_indent_labels = flush_left
+
+# Space preferences
+csharp_space_after_cast = false
+csharp_space_after_keywords_in_control_flow_statements = true
+csharp_space_between_method_declaration_parameter_list_parentheses = false
+csharp_space_between_method_call_parameter_list_parentheses = false
+csharp_space_before_colon_in_inheritance_clause = true
+csharp_space_after_colon_in_inheritance_clause = true
+csharp_space_around_binary_operators = before_and_after
+csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
+csharp_space_between_method_call_name_and_opening_parenthesis = false
+csharp_space_between_method_call_empty_parameter_list_parentheses = false
+
+# Wrapping preferences
+csharp_preserve_single_line_blocks = true
+csharp_preserve_single_line_statements = true
diff --git a/csharp/proverb/.exercism/config.json b/csharp/proverb/.exercism/config.json
new file mode 100644
index 0000000..e26ef93
--- /dev/null
+++ b/csharp/proverb/.exercism/config.json
@@ -0,0 +1,26 @@
+{
+ "blurb": "For want of a horseshoe nail, a kingdom was lost, or so the saying goes. Output the full text of this proverbial rhyme.",
+ "authors": [
+ "ErikSchierboom"
+ ],
+ "contributors": [
+ "j2jensen",
+ "jmbradnan",
+ "robkeim",
+ "ShamilS",
+ "wolf99"
+ ],
+ "files": {
+ "solution": [
+ "Proverb.cs"
+ ],
+ "test": [
+ "ProverbTests.cs"
+ ],
+ "example": [
+ ".meta/Example.cs"
+ ]
+ },
+ "source": "Wikipedia",
+ "source_url": "http://en.wikipedia.org/wiki/For_Want_of_a_Nail"
+}
diff --git a/csharp/proverb/.exercism/metadata.json b/csharp/proverb/.exercism/metadata.json
new file mode 100644
index 0000000..1b42e26
--- /dev/null
+++ b/csharp/proverb/.exercism/metadata.json
@@ -0,0 +1 @@
+{"track":"csharp","exercise":"proverb","id":"2fb26d386d05442aaea34958e319d67c","url":"https://exercism.org/tracks/csharp/exercises/proverb","handle":"benharri","is_requester":true,"auto_approve":false}
\ No newline at end of file
diff --git a/csharp/proverb/HELP.md b/csharp/proverb/HELP.md
new file mode 100644
index 0000000..78973dc
--- /dev/null
+++ b/csharp/proverb/HELP.md
@@ -0,0 +1,39 @@
+# Help
+
+## Running the tests
+
+You can run the tests by opening a command prompt in the exercise's directory, and then running the [`dotnet test` command](https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-test)
+Alternatively, most IDE's have built-in support for running tests, including [Visual Studio](https://docs.microsoft.com/en-us/visualstudio/test/run-unit-tests-with-test-explorer), [Rider](https://www.jetbrains.com/help/rider/Unit_Testing_in_Solution.html) and [Visual Studio code](https://github.com/OmniSharp/omnisharp-vscode/wiki/How-to-run-and-debug-unit-tests).
+See the [tests page](https://exercism.io/tracks/csharp/tests) for more information.
+
+## Skipped tests
+
+Initially, only the first test will be enabled.
+This is to encourage you to solve the exercise one step at a time.
+Once you get the first test passing, remove the `Skip` property from the next test and work on getting that test passing.
+
+## Submitting your solution
+
+You can submit your solution using the `exercism submit Proverb.cs` command.
+This command will upload your solution to the Exercism website and print the solution page's URL.
+
+It's possible to submit an incomplete solution which allows you to:
+
+- See how others have completed the exercise
+- Request help from a mentor
+
+## Need to get help?
+
+If you'd like help solving the exercise, check the following pages:
+
+- The [C# track's documentation](https://exercism.org/docs/tracks/csharp)
+- [Exercism's support channel on gitter](https://gitter.im/exercism/support)
+- The [Frequently Asked Questions](https://exercism.org/docs/using/faqs)
+
+Should those resources not suffice, you could submit your (incomplete) solution to request mentoring.
+
+To get help if you're having trouble, you can use one of the following resources:
+
+- [Gitter](https://gitter.im/exercism/xcsharp) is Exercism C# track's Gitter room; go here to get support and ask questions related to the C# track.
+- [/r/csharp](https://www.reddit.com/r/csharp) is the C# subreddit.
+- [StackOverflow](http://stackoverflow.com/questions/tagged/c%23) can be used to search for your problem and see if it has been answered already. You can also ask and answer questions.
\ No newline at end of file
diff --git a/csharp/proverb/Proverb.cs b/csharp/proverb/Proverb.cs
new file mode 100644
index 0000000..4622ff1
--- /dev/null
+++ b/csharp/proverb/Proverb.cs
@@ -0,0 +1,14 @@
+using System;
+
+public static class Proverb
+{
+ public static string[] Recite(string[] subjects)
+ {
+ if (subjects.Length == 0) return Array.Empty();
+ var result = new string[subjects.Length];
+ for (int i = 0; i < subjects.Length - 1; i++)
+ result[i] = $"For want of a {subjects[i]} the {subjects[i + 1]} was lost.";
+ result[subjects.Length - 1] = $"And all for the want of a {subjects[0]}.";
+ return result;
+ }
+}
\ No newline at end of file
diff --git a/csharp/proverb/Proverb.csproj b/csharp/proverb/Proverb.csproj
new file mode 100644
index 0000000..832ffac
--- /dev/null
+++ b/csharp/proverb/Proverb.csproj
@@ -0,0 +1,14 @@
+
+
+
+ net6.0
+
+
+
+
+
+
+
+
+
+
diff --git a/csharp/proverb/ProverbTests.cs b/csharp/proverb/ProverbTests.cs
new file mode 100644
index 0000000..f34ec6d
--- /dev/null
+++ b/csharp/proverb/ProverbTests.cs
@@ -0,0 +1,107 @@
+using System;
+using Xunit;
+
+public class ProverbTests
+{
+ [Fact]
+ public void Zero_pieces()
+ {
+ var strings = Array.Empty();
+ var expected = Array.Empty();
+ Assert.Equal(expected, Proverb.Recite(strings));
+ }
+
+ [Fact]
+ public void One_piece()
+ {
+ var strings = new[]
+ {
+ "nail"
+ };
+ var expected = new[]
+ {
+ "And all for the want of a nail."
+ };
+ Assert.Equal(expected, Proverb.Recite(strings));
+ }
+
+ [Fact]
+ public void Two_pieces()
+ {
+ var strings = new[]
+ {
+ "nail",
+ "shoe"
+ };
+ var expected = new[]
+ {
+ "For want of a nail the shoe was lost.",
+ "And all for the want of a nail."
+ };
+ Assert.Equal(expected, Proverb.Recite(strings));
+ }
+
+ [Fact]
+ public void Three_pieces()
+ {
+ var strings = new[]
+ {
+ "nail",
+ "shoe",
+ "horse"
+ };
+ var expected = new[]
+ {
+ "For want of a nail the shoe was lost.",
+ "For want of a shoe the horse was lost.",
+ "And all for the want of a nail."
+ };
+ Assert.Equal(expected, Proverb.Recite(strings));
+ }
+
+ [Fact]
+ public void Full_proverb()
+ {
+ var strings = new[]
+ {
+ "nail",
+ "shoe",
+ "horse",
+ "rider",
+ "message",
+ "battle",
+ "kingdom"
+ };
+ var expected = new[]
+ {
+ "For want of a nail the shoe was lost.",
+ "For want of a shoe the horse was lost.",
+ "For want of a horse the rider was lost.",
+ "For want of a rider the message was lost.",
+ "For want of a message the battle was lost.",
+ "For want of a battle the kingdom was lost.",
+ "And all for the want of a nail."
+ };
+ Assert.Equal(expected, Proverb.Recite(strings));
+ }
+
+ [Fact]
+ public void Four_pieces_modernized()
+ {
+ var strings = new[]
+ {
+ "pin",
+ "gun",
+ "soldier",
+ "battle"
+ };
+ var expected = new[]
+ {
+ "For want of a pin the gun was lost.",
+ "For want of a gun the soldier was lost.",
+ "For want of a soldier the battle was lost.",
+ "And all for the want of a pin."
+ };
+ Assert.Equal(expected, Proverb.Recite(strings));
+ }
+}
\ No newline at end of file
diff --git a/csharp/proverb/README.md b/csharp/proverb/README.md
new file mode 100644
index 0000000..9b781e5
--- /dev/null
+++ b/csharp/proverb/README.md
@@ -0,0 +1,42 @@
+# Proverb
+
+Welcome to Proverb on Exercism's C# Track.
+If you need help running the tests or submitting your code, check out `HELP.md`.
+
+## Instructions
+
+For want of a horseshoe nail, a kingdom was lost, or so the saying goes.
+
+Given a list of inputs, generate the relevant proverb. For example, given the list `["nail", "shoe", "horse", "rider", "message", "battle", "kingdom"]`, you will output the full text of this proverbial rhyme:
+
+```text
+For want of a nail the shoe was lost.
+For want of a shoe the horse was lost.
+For want of a horse the rider was lost.
+For want of a rider the message was lost.
+For want of a message the battle was lost.
+For want of a battle the kingdom was lost.
+And all for the want of a nail.
+```
+
+Note that the list of inputs may vary; your solution should be able to handle lists of arbitrary length and content. No line of the output text should be a static, unchanging string; all should vary according to the input given.
+
+Try to capture the structure of the song in your code, where you build up the song by composing its parts.
+
+## Source
+
+### Created by
+
+- @ErikSchierboom
+
+### Contributed to by
+
+- @j2jensen
+- @jmbradnan
+- @robkeim
+- @ShamilS
+- @wolf99
+
+### Based on
+
+Wikipedia - http://en.wikipedia.org/wiki/For_Want_of_a_Nail
\ No newline at end of file
diff --git a/csharp/triangle/.editorconfig b/csharp/triangle/.editorconfig
new file mode 100644
index 0000000..6d98253
--- /dev/null
+++ b/csharp/triangle/.editorconfig
@@ -0,0 +1,141 @@
+###############################
+# Core EditorConfig Options #
+###############################
+
+; This file is for unifying the coding style for different editors and IDEs.
+; More information at:
+; https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference?view=vs-2017
+; https://docs.microsoft.com/en-us/visualstudio/ide/create-portable-custom-editor-options?view=vs-2017
+
+root = true
+
+[*]
+indent_style = space
+
+[Triangle.cs]
+indent_size = 4
+
+###############################
+# .NET Coding Conventions #
+###############################
+
+# Organize usings
+dotnet_sort_system_directives_first = true
+dotnet_separate_import_directive_groups = true
+
+# this. preferences
+dotnet_style_qualification_for_field = false:suggestion
+dotnet_style_qualification_for_property = false:suggestion
+dotnet_style_qualification_for_method = false:suggestion
+dotnet_style_qualification_for_event = false:suggestion
+
+# Language keywords vs BCL types preferences
+dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion
+dotnet_style_predefined_type_for_member_access = true:suggestion
+
+# Parentheses preferences
+dotnet_style_parentheses_in_arithmetic_binary_operators = never_if_unnecessary:none
+dotnet_style_parentheses_in_relational_binary_operators = never_if_unnecessary:none
+dotnet_style_parentheses_in_other_binary_operators = never_if_unnecessary:none
+dotnet_style_parentheses_in_other_operators = never_if_unnecessary:suggestion
+
+# Modifier preferences
+dotnet_style_require_accessibility_modifiers = always:suggestion
+dotnet_style_readonly_field = true:suggestion
+
+# Expression-level preferences
+dotnet_style_object_initializer = true:suggestion
+dotnet_style_collection_initializer = true:suggestion
+dotnet_style_explicit_tuple_names = true:suggestion
+dotnet_style_prefer_inferred_tuple_names = true:suggestion
+dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
+dotnet_style_prefer_auto_properties = true:suggestion
+dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion
+dotnet_style_prefer_conditional_expression_over_assignment = true:suggestion
+dotnet_style_prefer_conditional_expression_over_return = true:suggestion
+dotnet_style_coalesce_expression = true:suggestion
+dotnet_style_null_propagation = true:suggestion
+
+###############################
+# Naming Conventions #
+###############################
+
+# Style Definitions
+dotnet_naming_style.pascal_case_style.capitalization = pascal_case
+
+# Use PascalCase for constant fields
+dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion
+dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields
+dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style
+dotnet_naming_symbols.constant_fields.applicable_kinds = field
+dotnet_naming_symbols.constant_fields.applicable_accessibilities = *
+dotnet_naming_symbols.constant_fields.required_modifiers = const
+
+###############################
+# C# Code Style Rules #
+###############################
+
+# var preferences
+csharp_style_var_for_built_in_types = true:none
+csharp_style_var_when_type_is_apparent = true:none
+csharp_style_var_elsewhere = true:none
+
+# Expression-bodied members
+csharp_style_expression_bodied_methods = true:suggestion
+csharp_style_expression_bodied_constructors = true:suggestion
+csharp_style_expression_bodied_operators = true:suggestion
+csharp_style_expression_bodied_properties = true:suggestion
+csharp_style_expression_bodied_indexers = true:suggestion
+csharp_style_expression_bodied_accessors = true:suggestion
+
+# Pattern-matching preferences
+csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion
+csharp_style_pattern_matching_over_as_with_null_check = true:suggestion
+
+# Null-checking preferences
+csharp_style_throw_expression = true:suggestion
+csharp_style_conditional_delegate_call = true:suggestion
+
+# Modifier preferences
+csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:suggestion
+
+# Expression-level preferences
+csharp_prefer_braces = true:none
+csharp_prefer_simple_default_expression = true:suggestion
+csharp_style_deconstructed_variable_declaration = true:suggestion
+csharp_style_pattern_local_over_anonymous_function = true:suggestion
+csharp_style_inlined_variable_declaration = true:suggestion
+
+###############################
+# C# Formatting Rules #
+###############################
+
+# New line preferences
+csharp_new_line_before_open_brace = all
+csharp_new_line_before_else = true
+csharp_new_line_before_catch = true
+csharp_new_line_before_finally = true
+csharp_new_line_before_members_in_object_initializers = false
+csharp_new_line_before_members_in_anonymous_types = false
+csharp_new_line_between_query_expression_clauses = true
+
+# Indentation preferences
+csharp_indent_case_contents = true
+csharp_indent_switch_labels = true
+csharp_indent_labels = flush_left
+
+# Space preferences
+csharp_space_after_cast = false
+csharp_space_after_keywords_in_control_flow_statements = true
+csharp_space_between_method_declaration_parameter_list_parentheses = false
+csharp_space_between_method_call_parameter_list_parentheses = false
+csharp_space_before_colon_in_inheritance_clause = true
+csharp_space_after_colon_in_inheritance_clause = true
+csharp_space_around_binary_operators = before_and_after
+csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
+csharp_space_between_method_call_name_and_opening_parenthesis = false
+csharp_space_between_method_call_empty_parameter_list_parentheses = false
+
+# Wrapping preferences
+csharp_preserve_single_line_blocks = true
+csharp_preserve_single_line_statements = true
diff --git a/csharp/triangle/.exercism/config.json b/csharp/triangle/.exercism/config.json
new file mode 100644
index 0000000..adddd12
--- /dev/null
+++ b/csharp/triangle/.exercism/config.json
@@ -0,0 +1,28 @@
+{
+ "blurb": "Determine if a triangle is equilateral, isosceles, or scalene.",
+ "authors": [
+ "bressain"
+ ],
+ "contributors": [
+ "bmeverett",
+ "ErikSchierboom",
+ "j2jensen",
+ "jwood803",
+ "robkeim",
+ "tushartyagi",
+ "wolf99"
+ ],
+ "files": {
+ "solution": [
+ "Triangle.cs"
+ ],
+ "test": [
+ "TriangleTests.cs"
+ ],
+ "example": [
+ ".meta/Example.cs"
+ ]
+ },
+ "source": "The Ruby Koans triangle project, parts 1 & 2",
+ "source_url": "http://rubykoans.com"
+}
diff --git a/csharp/triangle/.exercism/metadata.json b/csharp/triangle/.exercism/metadata.json
new file mode 100644
index 0000000..6c87d13
--- /dev/null
+++ b/csharp/triangle/.exercism/metadata.json
@@ -0,0 +1 @@
+{"track":"csharp","exercise":"triangle","id":"03abff63966644beb3cfbb5c2417ccd6","url":"https://exercism.org/tracks/csharp/exercises/triangle","handle":"benharri","is_requester":true,"auto_approve":false}
\ No newline at end of file
diff --git a/csharp/triangle/HELP.md b/csharp/triangle/HELP.md
new file mode 100644
index 0000000..30c41fd
--- /dev/null
+++ b/csharp/triangle/HELP.md
@@ -0,0 +1,39 @@
+# Help
+
+## Running the tests
+
+You can run the tests by opening a command prompt in the exercise's directory, and then running the [`dotnet test` command](https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-test)
+Alternatively, most IDE's have built-in support for running tests, including [Visual Studio](https://docs.microsoft.com/en-us/visualstudio/test/run-unit-tests-with-test-explorer), [Rider](https://www.jetbrains.com/help/rider/Unit_Testing_in_Solution.html) and [Visual Studio code](https://github.com/OmniSharp/omnisharp-vscode/wiki/How-to-run-and-debug-unit-tests).
+See the [tests page](https://exercism.io/tracks/csharp/tests) for more information.
+
+## Skipped tests
+
+Initially, only the first test will be enabled.
+This is to encourage you to solve the exercise one step at a time.
+Once you get the first test passing, remove the `Skip` property from the next test and work on getting that test passing.
+
+## Submitting your solution
+
+You can submit your solution using the `exercism submit Triangle.cs` command.
+This command will upload your solution to the Exercism website and print the solution page's URL.
+
+It's possible to submit an incomplete solution which allows you to:
+
+- See how others have completed the exercise
+- Request help from a mentor
+
+## Need to get help?
+
+If you'd like help solving the exercise, check the following pages:
+
+- The [C# track's documentation](https://exercism.org/docs/tracks/csharp)
+- [Exercism's support channel on gitter](https://gitter.im/exercism/support)
+- The [Frequently Asked Questions](https://exercism.org/docs/using/faqs)
+
+Should those resources not suffice, you could submit your (incomplete) solution to request mentoring.
+
+To get help if you're having trouble, you can use one of the following resources:
+
+- [Gitter](https://gitter.im/exercism/xcsharp) is Exercism C# track's Gitter room; go here to get support and ask questions related to the C# track.
+- [/r/csharp](https://www.reddit.com/r/csharp) is the C# subreddit.
+- [StackOverflow](http://stackoverflow.com/questions/tagged/c%23) can be used to search for your problem and see if it has been answered already. You can also ask and answer questions.
\ No newline at end of file
diff --git a/csharp/triangle/README.md b/csharp/triangle/README.md
new file mode 100644
index 0000000..317c887
--- /dev/null
+++ b/csharp/triangle/README.md
@@ -0,0 +1,48 @@
+# Triangle
+
+Welcome to Triangle on Exercism's C# Track.
+If you need help running the tests or submitting your code, check out `HELP.md`.
+
+## Instructions
+
+Determine if a triangle is equilateral, isosceles, or scalene.
+
+An _equilateral_ triangle has all three sides the same length.
+
+An _isosceles_ triangle has at least two sides the same length. (It is sometimes
+specified as having exactly two sides the same length, but for the purposes of
+this exercise we'll say at least two.)
+
+A _scalene_ triangle has all sides of different lengths.
+
+## Note
+
+For a shape to be a triangle at all, all sides have to be of length > 0, and
+the sum of the lengths of any two sides must be greater than or equal to the
+length of the third side. See [Triangle Inequality](https://en.wikipedia.org/wiki/Triangle_inequality).
+
+## Dig Deeper
+
+The case where the sum of the lengths of two sides _equals_ that of the
+third is known as a _degenerate_ triangle - it has zero area and looks like
+a single line. Feel free to add your own code/tests to check for degenerate triangles.
+
+## Source
+
+### Created by
+
+- @bressain
+
+### Contributed to by
+
+- @bmeverett
+- @ErikSchierboom
+- @j2jensen
+- @jwood803
+- @robkeim
+- @tushartyagi
+- @wolf99
+
+### Based on
+
+The Ruby Koans triangle project, parts 1 & 2 - http://rubykoans.com
\ No newline at end of file
diff --git a/csharp/triangle/Triangle.cs b/csharp/triangle/Triangle.cs
new file mode 100644
index 0000000..0d0d0f5
--- /dev/null
+++ b/csharp/triangle/Triangle.cs
@@ -0,0 +1,18 @@
+public static class Triangle
+{
+ public static bool IsScalene(double side1, double side2, double side3) =>
+ side1 != side2 && side2 != side3 && side1 != side3
+ && !IsDegenerate(side1, side2, side3);
+
+ public static bool IsIsosceles(double side1, double side2, double side3) =>
+ (side1 == side2 || side2 == side3 || side1 == side3)
+ && !IsDegenerate(side1, side2, side3);
+
+ public static bool IsEquilateral(double side1, double side2, double side3) =>
+ side1 == side2 && side2 == side3
+ && !IsDegenerate(side1, side2, side3);
+
+ private static bool IsDegenerate(double side1, double side2, double side3) =>
+ side1 == 0 || side2 == 0 || side3 == 0
+ || (side1 >= side2 + side3) || (side2 >= side1 + side3) || (side3 >= side1 + side2);
+}
diff --git a/csharp/triangle/Triangle.csproj b/csharp/triangle/Triangle.csproj
new file mode 100644
index 0000000..832ffac
--- /dev/null
+++ b/csharp/triangle/Triangle.csproj
@@ -0,0 +1,14 @@
+
+
+
+ net6.0
+
+
+
+
+
+
+
+
+
+
diff --git a/csharp/triangle/TriangleTests.cs b/csharp/triangle/TriangleTests.cs
new file mode 100644
index 0000000..333bce8
--- /dev/null
+++ b/csharp/triangle/TriangleTests.cs
@@ -0,0 +1,118 @@
+using Xunit;
+
+public class TriangleTests
+{
+ [Fact]
+ public void Equilateral_triangle_all_sides_are_equal()
+ {
+ Assert.True(Triangle.IsEquilateral(2, 2, 2));
+ }
+
+ [Fact]
+ public void Equilateral_triangle_any_side_is_unequal()
+ {
+ Assert.False(Triangle.IsEquilateral(2, 3, 2));
+ }
+
+ [Fact]
+ public void Equilateral_triangle_no_sides_are_equal()
+ {
+ Assert.False(Triangle.IsEquilateral(5, 4, 6));
+ }
+
+ [Fact]
+ public void Equilateral_triangle_all_zero_sides_is_not_a_triangle()
+ {
+ Assert.False(Triangle.IsEquilateral(0, 0, 0));
+ }
+
+ [Fact]
+ public void Equilateral_triangle_sides_may_be_floats()
+ {
+ Assert.True(Triangle.IsEquilateral(0.5, 0.5, 0.5));
+ }
+
+ [Fact]
+ public void Isosceles_triangle_last_two_sides_are_equal()
+ {
+ Assert.True(Triangle.IsIsosceles(3, 4, 4));
+ }
+
+ [Fact]
+ public void Isosceles_triangle_first_two_sides_are_equal()
+ {
+ Assert.True(Triangle.IsIsosceles(4, 4, 3));
+ }
+
+ [Fact]
+ public void Isosceles_triangle_first_and_last_sides_are_equal()
+ {
+ Assert.True(Triangle.IsIsosceles(4, 3, 4));
+ }
+
+ [Fact]
+ public void Isosceles_triangle_equilateral_triangles_are_also_isosceles()
+ {
+ Assert.True(Triangle.IsIsosceles(4, 4, 4));
+ }
+
+ [Fact]
+ public void Isosceles_triangle_no_sides_are_equal()
+ {
+ Assert.False(Triangle.IsIsosceles(2, 3, 4));
+ }
+
+ [Fact]
+ public void Isosceles_triangle_first_triangle_inequality_violation()
+ {
+ Assert.False(Triangle.IsIsosceles(1, 1, 3));
+ }
+
+ [Fact]
+ public void Isosceles_triangle_second_triangle_inequality_violation()
+ {
+ Assert.False(Triangle.IsIsosceles(1, 3, 1));
+ }
+
+ [Fact]
+ public void Isosceles_triangle_third_triangle_inequality_violation()
+ {
+ Assert.False(Triangle.IsIsosceles(3, 1, 1));
+ }
+
+ [Fact]
+ public void Isosceles_triangle_sides_may_be_floats()
+ {
+ Assert.True(Triangle.IsIsosceles(0.5, 0.4, 0.5));
+ }
+
+ [Fact]
+ public void Scalene_triangle_no_sides_are_equal()
+ {
+ Assert.True(Triangle.IsScalene(5, 4, 6));
+ }
+
+ [Fact]
+ public void Scalene_triangle_all_sides_are_equal()
+ {
+ Assert.False(Triangle.IsScalene(4, 4, 4));
+ }
+
+ [Fact]
+ public void Scalene_triangle_two_sides_are_equal()
+ {
+ Assert.False(Triangle.IsScalene(4, 4, 3));
+ }
+
+ [Fact]
+ public void Scalene_triangle_may_not_violate_triangle_inequality()
+ {
+ Assert.False(Triangle.IsScalene(7, 3, 2));
+ }
+
+ [Fact]
+ public void Scalene_triangle_sides_may_be_floats()
+ {
+ Assert.True(Triangle.IsScalene(0.5, 0.4, 0.6));
+ }
+}
\ No newline at end of file