C# (C Sharp) programming
18.7K subscribers
756 photos
38 videos
8 files
675 links
По всем вопросам- @haarrp

C# - обучающий канал Senior C# разработчика.

@ai_machinelearning_big_data - Machine learning

@itchannels_telegram - 🔥лучшие ит-каналы

@csharp_ci - C# академия

@pythonlbooks- книги📚

Реестр РКН: https://clck.ru/3Fk3kb
Download Telegram
🛠 Entity Framework Core Power Tools — инструмент для обратной разработки (reverse engineering), миграции и визуализация моделей для EF Core.

Инструмент стремится снизить планку для начала работы с EF Core, предоставляя удобный UI с обратной разработкой существующей базы данных, созданием миграций и визуализацией вашей модели DbContext.

🖥 Github

@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡️ Testcontainers для .NET

Проект для поддержки тестов с одноразовыми экземплярами Docker-контейнеров для всех совместимых версий .NET Standard.

Testcontainers построен на основе API .NET Docker и обеспечивает упрощенную реализацию для поддержки вашей тестовой среды.

🖥 Github

@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Dynamic Language Runtime
DLR в C#. Ключевое слово dynamic

Хотя C# относится к статически типизированным языкам, в последних версиях языка были добавлены некоторые динамические возможности. Так, начиная с .NET 4.0 была добавлена новая функциональность под названием DLR (Dynamic Language Runtime). DLR представляет среду выполнения динамических языков, например, таких языков как IronPython и IronRuby.

Чтобы понять значение данного нововведение, нужно осознавать разичие между языками со статической и динамической типизицией. В языках со статической типизацией выявление всех типов и их членов - свойств и методов происходит на этапе компиляции. А в динамических языках системе ничего не известно о свойствах и методах типов вплоть до выполнения.

Благодаря этой среде DLR C# может создавать динамические объекты, члены которых выявляются на этапе выполнения программы, и использовать их вместе с традиционными объектами со статической типизацией.

Ключевым моментом использования DLR в C# является применение типов dynamic. Это ключевое слово позволяет опустить проверку типов во время компиляции. Кроме того, объекты, объявленные как dynamic, могут в течение работы программы менять свой тип. Например:


dynamic obj = 3; // здесь obj - целочисленное int
Console.WriteLine(obj); // 3

obj = "Hello world"; // obj - строка
Console.WriteLine(obj); // Hello world

obj = new Person("Tom", 37); // obj - объект Person
Console.WriteLine(obj); // Person { Name = Tom, Age = 37 }


record class Person(string Name, int Age);
Несмотря на то, что переменная x меняет тип своего значения несколько раз, данный код будет нормально работать. В этом использование типов dynamic отличается от применения ключевого слова var. Для переменной, объявленной с помощью ключевого слова var, тип выводится во время компиляции и затем во время выполнения больше не меняется.

Также можно найти общее между использованием dynamic и типом object. Если в предыдущем примере мы заменим dynamic на object: object x = 3;, то результат будет тот же. Однако и тут есть различия. Например:

object obj = 24;
dynamic dyn = 24;
obj += 4; // так нельзя
dyn += 4; // а так можно

На строке obj += 4; мы увидим ошибку, так как операция += не может быть применена к типам object и int. С переменной, объявленной как dynamic, это пройдет, так как ее тип будет известен только во время выполнения.

Еще одна отличительная особенность использования dynamic состоит в том, что это ключевое слово применяется не только к переменным, но и к свойствам и методам. Например:

class Person
{
public string Name { get;}
public dynamic Age { get; set; }
public Person(string name, dynamic age)
{
Name = name; Age = age;
}

// выводим зарплату в зависимости от переданного формата
public dynamic GetSalary(dynamic value, string format)
{
if (format == "string") return $"{value} euro";
else if (format == "int") return value;
else return 0.0;
}

public override string ToString() => $"Name: {Name} Age: {Age}";
}

В классе Person определено динамическое свойство Age, поэтому при задании значения этому свойству мы можем написать и person.Age=22, и person.Age="twenty-two". Оба варианта будут допустимыми. А через параметр age в конструкторе этому свойству можно передать любое значение.

Также есть метод GetSalary, который возвращает значение dynamic. Например, в зависимости от параметра мы можем вернуть или строковое представление суммы дохода или численное. Также метод принимает dynamic в качестве параметра. Таким образом, мы можем передать в качестве значения дохода как целое, так и дробное число или строку. Посмотрим на конкретное применение:

dynamic tom = new Person("Tom", 22);
Console.WriteLine(tom);
Console.WriteLine(tom.GetSalary(28, "int"));

dynamic bob = new Person("Bob", "twenty-two");
Console.WriteLine(bob);
Console.WriteLine(bob.GetSalary("twenty-eight", "string"));


Консольный вывод программы:

Name: Tom Age: 22
28
Name: Bob Age: twenty-two
twenty-eight euro


@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
⚜️ Подборка Топ-10 поезныйх библиотек для разработчиков .NET

1) Newtonsoft.Json: Эта библиотека широко используется для работы с данными JSON в приложениях .NET. Newtonsoft.Json обеспечивает высокую производительность и простоту использования, что делает ее отличным решением для сериализации и десериализации данных JSON.

2) Dapper: Это простой и эффективный ORM, который обеспечивает высокую производительность и гибкость при работе с реляционными базами данных. Dapper прост в использовании и предлагает быстрый и эффективный способ взаимодействия с базами данных.

3) Polly: Polly - это библиотека, которая помогает легко обрабатывать ошибки в приложениях .NET.

4) AutoMapper: Эта библиотека .NET Core упрощает сопоставление объектов с объектами путем автоматического сопоставления свойств одного объекта с другим. Эта библиотека особенно полезна в больших проектах, где сопоставление может занять много времени и стать утомительным.

5) FluentValidation: Это библиотека, которая предоставляет API для построения правил валидации. Она позволяет легко создавать сложную логику проверки и поддерживает широкий спектр скриптов валидации, что делает ее полезным инструментом для обеспечения целостности данных в ваших приложениях.

6) Serilog: Эта библиотека представляет собой структурированную библиотеку протоколирования, которая упрощает сбор и анализ журналов вашего приложения. Она обеспечивает гибкость и расширяемость и поддерживает различные источники для хранения журналов, включая Elasticsearch, SQL Server и другие.

7) Swashbuckle.AspNetCore.Swagger: Эта библиотека генерирует документацию OpenAPI для вашего ASP.NET Core Web API. Она облегчает понимание функциональности вашего API и позволяет легко генерировать код для вашего API.

8) NLog: Это бесплатная платформа протоколирования для .NET с широкими возможностями маршрутизации и управления журналами.

9) Moq4: Это популярный фреймворк mocking для приложений .NET. Она позволяет легко создавать объекты для модульного тестирования.

10) StackExchange.Redis: Это библиотека для работы с базами данных Redis в приложениях .NET. Она предоставляет простой и эффективный способ взаимодействия с Redis, а также обеспечивает высокую производительность и масштабируемость.

@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
Как прокачать навыки в С++, если вы уже знаете основы языка

Разработчикам на С++, которые хотят прокачать навыки или ищут точки роста в карьере, выйти на новый этап развития поможет активное самообучение: закрепление теории и отработка знаний на практике. Вот только полагаться лучше не на случайные интернет-источники, а на материалы лидеров индустрии.

Советуем обратить внимание на бесплатный хендбук Академии Яндекса. Этот онлайн-учебник по С++ был создан специально для того, чтобы начинающие специалисты могли самостоятельно освоить новые темы, а более опытные — освежить знания. В хендбуке есть как теория, так и задачи с автопроверкой.

Сохраняйте ссылку и погружайтесь в бесплатные материалы по С++: https://clck.ru/33t57f
Книга дня. Конкурентность в C#. Асинхронное, параллельное и многопоточное программирование

Автор: Стивен Клири

Автор поможет разобраться с трудностями и избежать подводных камней, возникающих при решении реальных задач. В вашем распоряжении 85 рецептов работы с .NET и C# 8.0, необходимых для параллельной обработки и асинхронного программирования.
#c_Sharp

📚Книга

@cpluscsharp
🖥 Задача с leetcode. Max Area of Island

Максимальная площадь острова

Сложность: Средняя

Условие задачи: Условие задачи:

Дан двумерный массив размера m x n. "1" отвечает за сушу, "0" - за океан. Необходимо опеределить максмимальную площадь острова из островов, расположенных на карте.

Островом считается территория, образованная из "1", расположенных сверху, справа, снизу и слева относительно друг друга.


Пример:

Ввод:
grid = [[0,0,1,0,0,0,0,1,0,0,0,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,1,1,0,1,0,0,0,0,0,0,0,0],[0,1,0,0,1,1,0,0,1,0,1,0,0],[0,1,0,0,1,1,0,0,1,1,1,0,0],[0,0,0,0,0,0,0,0,0,0,1,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,0,0,0,0,0,0,1,1,0,0,0,0]]

Вывод: 6

Ввод: grid = [[0,0,0,0,0,0,0,0]]

Вывод: 0

Решение

public class Solution {
public int MaxAreaOfIsland(int[][] grid)
{
var best = 0;
var travelled = new bool[grid.Length][];

for (var i = 0; i < grid.Length; i++)
travelled[i] = new bool[grid[i].Length];

for (var i = 0; i < grid.Length; i++)
for (var j = 0; j < grid[0].Length; j++)
if (grid[i][j] == 1 && !travelled[i][j])
{
var q = ExploreIsland(grid, i, j, travelled);
best = Math.Max(best, q);
}

return best;
}

private int ExploreIsland(int[][] grid, int i, int j, bool[][] travelled)
{
if (i < 0 || j < 0 || i >= travelled.Length || j >= travelled[0].Length) return 0;
if (grid[i][j] == 0 || travelled[i][j]) return 0;

travelled[i][j] = true;

var north = ExploreIsland(grid, i + 1, j, travelled);
var west = ExploreIsland(grid, i, j - 1, travelled);
var east = ExploreIsland(grid, i, j + 1, travelled);
var south = ExploreIsland(grid, i - 1, j, travelled);

return north + west + east + south + 1;
}
}

Временная сложность : O(n^2*m^2)
Пространственная сложность: O(n∗m)


Пишите свое решение в комментариях👇

@cpluscsharp
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Lists & enumerables

Продолжаем говорить о Linq. Библиотека Linq очень полезна для написания быстрых, однострочных функций, приведем несколько примеров с кодом:

Суммирование всех чисел в диапазоне:

using System;
using System.Linq;

public class Program {
public static void Main() {
Console.WriteLine(Enumerable.Range(1, 100).Sum());
}
}

Применение функции ко всем числам в списке:

using System;
using System.Linq;

public class Program {
private static int Square(int n) => n * n;

public static void Main() {
int[] arr = { 1, 2, 3, 4 };

// direct anonymous function
int[] arr2 = arr.Select(n => n * n).ToArray();
// using another method
int[] arr3 = arr.Select(Square).ToArray();

foreach (int n in arr2)
Console.WriteLine(n); // output: 1, 4, 9, 16
foreach (int n in arr3)
Console.WriteLine(n); // output: 1, 4, 9, 16
}
}


Фильтрация списка номеров:

using System;
using System.Linq;

public class Program {
private static bool IsValid(int n) => n % 2 == 0 && n > 4;

public static void Main() {
int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

// direct anonymous function
int[] arr2 = arr.Where(n => n % 2 == 0 && n > 4).ToArray();
// using another method
int[] arr3 = arr.Where(IsValid).ToArray();

foreach (int n in arr2)
Console.WriteLine(n); // output: 6, 8
foreach (int n in arr3)
Console.WriteLine(n); // output: 6, 8
}
}


Нахождение минимального/максимального значения в списке:

using System;
using System.Linq;

public class Program {
public static void Main() {
int[] arr = { 4, 7, 2, 1, 3, 6, 9, 8, 0, 5 };
Console.WriteLine(Enumerable.Min(arr)); // output: 0
Console.WriteLine(Enumerable.Max(arr)); // output: 9
}
}

@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
⚜️ArchUnitNET

ArchUnitNET - это бесплатная, простая библиотека для проверки архитектуры кода на C#. ArchUnitNET это форк https://www.archunit.org/ для Java.

PS> Install-Package ArchUnitNET

Github
Документация

@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
Задача. Слияние двух бинарных деревьев

Сложность: Лёгкая

Условие задачи: Даны два бинарных дерева, необходимо осуществить их наложение друг на друга и вывод результатов в новом дереве.

Примечание: Наложение представляет из себя суммирование соответствующих значений из узлов двух деревьев.

Пример:

Ввод:
root1 = [1,3,2,5], root2 = [2,1,3,null,4,null,7]
Вывод:
[3,4,5,5,4,null,7]

Ввод:
root1 = [1], root2 = [1,2]
Вывод:
[2,2]

* Определение для узла двоичного дерева.
* public class TreeNode {
* public int val;
* public TreeNode left;
* public TreeNode right;
* public TreeNode(int val=0, TreeNode left=null, TreeNode right=null) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
public class Solution {
public TreeNode MergeTrees(TreeNode root1, TreeNode root2)
{
if (root1 == null & root2 == null) return null;
if (root1 == null) return root2;
if (root2 == null) return root1;

var left = MergeTrees(root1.left, root2.left);
var right = MergeTrees(root1.right, root2.right);

if (root1.left != left) root1.left = left;
if (root1.right != right) root1.right = right;

root1.val += root2.val;

return root1;
}
}


Пишите свое мнение в комментариях👇

@csharp_ci
🔎 Полное руководство по созданию приложения-клона Google Translate с нуля на .NET

Добрый день! Я действительно взволнован проектом, который мне удалось создать для вас. Я сделал всё возможное, чтобы представить вам что-то с почти полной функциональностью, что-то, что вы можете продемонстрировать в своём портфолио, если вы новичок, и не волнуйтесь, дальше я начну создавать проекты для разработчиков среднего и продвинутого уровня, просто имейте немного терпения, пока я сосредоточен на новых разработчиках .NET.

Сегодняшний проект является клоном приложения Google Translate с использованием Google translate API v2. Я эстет, поэтому я представлю вам красивое приложение, однако оно будет не только «красивым», но также будет переводить текст, определять язык на основе пользовательского ввода, отображать поддерживаемые языки и менять местами пользовательский ввод с результатом перевода. Так что, если вы так же взволнованы, как и я, давайте сделаем это!

Статья
Полный код

@csharp_ci
📌 10 наиболее часто задаваемых технических вопросов на собеседованиях по C#

Как разработчику C#, вам, вероятно, не привыкать нервничать перед собеседованием. Но не волнуйтесь. Мы вам поможем! В этой статье мы обсудим 10 наиболее часто задаваемых технических вопросов на собеседованиях по C# и покажем, как на них отвечать.

Читать

@csharp_ci
C# для профессионалов: тонкости программирования
Автор: Джон Скит

Книга расскажет о сложных областях и темных закоулках языка, которые может предоставить только эксперт Джон Скит.
#c_Sharp

📚 Книга

@csharp_ci
💡 Clean Architecture

Отправная точка для чистой архитектуры с ASP.NET Core.

🖥 Github

@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Mockaco

HTTP mock-сервер, полезный для создания заглушек сервисов и имитации ответов API, использующий возможности ASP.NET Core, встроенную генерацию фальшивых данных.

🖥 Github

@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
Что вывдет код?

@csharp_ci