Skip to content

Instantly share code, notes, and snippets.

View mirmostafa's full-sized avatar
🧗‍♂️
Coding is my lifestyle. But I live in Iran 😢

Mohammad Mirmostafa mirmostafa

🧗‍♂️
Coding is my lifestyle. But I live in Iran 😢
View GitHub Profile
@mirmostafa
mirmostafa / _ReadMe.md
Last active September 11, 2024 09:53
Pattern Matching in C# 12

بهبودهای جدید در Pattern Matching در C# 12

مطابقت با الگوها (Pattern Matching) از نسخه C# 7 معرفی شد و در هر نسخه بعدی بهبود یافته است. در C# 12، امکانات جدیدی به Pattern Matching اضافه شده که امکان نوشتن کدهای خواناتر و قدرتمندتر را فراهم می‌کند. در اینجا به برخی از بهبودهای کلیدی می‌پردازیم:

1. Extended List Patterns

در C# 12، الگوهای لیستی (List Patterns) گسترش یافته‌اند تا با مجموعه‌های پیچیده‌تر مانند آرایه‌ها، List<T> و سایر انواع مجموعه‌ها مطابقت پیدا کنند. الگوهای لیستی به شما اجازه می‌دهند تا از عملیات‌هایی مانند چک کردن وجود عناصر در یک لیست یا انجام عملیات‌های مختلف روی آن‌ها به شکلی تمیز و قابل‌خواندن استفاده کنید.

مثال:
@mirmostafa
mirmostafa / Directory.Packages.props
Last active September 8, 2024 17:10
Best practice for `Directory.Packages.props` by .NET 9.0
<Project>
<PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<LangVersion>preview</LangVersion>
<EnablePreviewFeatures>true</EnablePreviewFeatures>
<GenerateRequiresPreviewFeaturesAttribute>true</GenerateRequiresPreviewFeaturesAttribute>
@mirmostafa
mirmostafa / Directory.Build.props
Created June 12, 2024 12:46
Build acceleration
<Project>
<!--
This Directory.Build.props files sets default properties that apply to all projects found in
this folder or subfolders, recursively.
-->
<PropertyGroup>
<!-- Enable Build Acceleration in Visual Studio. -->
<AccelerateBuildsInVisualStudio>true</AccelerateBuildsInVisualStudio>
<!--
@mirmostafa
mirmostafa / sample.cs
Created March 2, 2024 13:33
Pattern Matching - Variable
bool? isOk = dbResult is not null and { Found: true, HasAccess: var hasAccess } ? has Access : null;
@mirmostafa
mirmostafa / EnumerableHelper.cs
Created March 28, 2023 06:59
Mix of Iterator Patteren and Pattern Matching
public static IEnumerable<T> AddRangeImmuted<T>(this IEnumerable<T>? source, IEnumerable<T>? items)
{
return (source, items) switch
{
(null, null) => Enumerable.Empty<T>(),
(_, null) => source,
(null, _) => items,
(_, _) => addRangeImmutedIterator(source, items)
};
static IEnumerable<T> addRangeImmutedIterator(IEnumerable<T> source, IEnumerable<T> items)
@mirmostafa
mirmostafa / .editorconfig
Last active February 10, 2023 14:58
My preferred editorconfig
# Remove the line below if you want to inherit .editorconfig settings from higher directories
root = true
# C# files
[*.cs]
#### Core EditorConfig Options ####
# Indentation and spacing
indent_size = 4
@mirmostafa
mirmostafa / startup.cs
Last active February 17, 2024 11:38
Add IoC and Mock DB to xunit test
public static void ConfigureServices(IServiceCollection services)
{
services.AddUnitTestServices();
var result = services.BuildServiceProvider();
DI.Initialize(result);
InitializeDatabase();
}
private static void InitializeDatabase()
{
var db = DI.GetService<InfraWriteDbContext>();
@mirmostafa
mirmostafa / IsNullOrEmpty-SingleMethod.cs
Created July 30, 2022 08:26
IsNullOrEmpty, using pattern matching
public static bool IsNullOrEmpty([NotNullWhen(false)] this string? str) => str?.Length is null or 0;
public static bool IsNullOrEmpty([NotNullWhen(false)] this string? str) => str is null or { Length: 0 };
@mirmostafa
mirmostafa / Program.cs
Created July 23, 2022 04:28
Use Autofac in Blazor server-side
using Autofac;
using Autofac.Extensions.DependencyInjection;
using HanyCo.Infra;
using Library.Cqrs;
using Library.Mapping;
namespace BlazorApp;
@mirmostafa
mirmostafa / 1_Monad.cs
Created July 21, 2022 08:57
Simple Monad Design Pattern in C#
public class Monad<TValue>
{
private readonly TValue? _value;
public Monad(TValue? value)
=> this._value = value;
public Monad<TResult?> AnyWay<TResult>(in Func<TValue?, TResult?> func)
=> new(func(this._value));