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
🖥 Что выведет код?

public class Employee
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
}

public class Manager : Employee
{
private string name;
public new string Name
{
get { return name; }
set { name = value + ", Manager"; }
}
}

class Program
{
static void Main()
{
Manager m1 = new Manager();

m1.Name = "John";

((Employee)m1).Name = "Mary";

Console.WriteLine(m1.Name);
}
}


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

@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡️ Pidgin

Легкая, быстрая и гибкая библиотека синтаксического анализа для C#.

🖥 Github

@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Задача: последовательность Посмотри-и-скажи (Count and Say) — это последовательность целых чисел с первыми пятью слагаемыми:

1, 11, 21, 1211, 111221, …

Каждое последующее число генерируется из предыдущего путём конкатенции цифры, из которой состоит группа одинаковых цифр и количества цифр в этой группе, для каждой группы одинаковых цифр в числе. Например:

1 читается как «одна единица», то есть 11
11 читается как «две единицы», то есть 21
21 читается как «одна двойка, одна единица», то есть 1211
1211 читается как «одна единица, одна двойка, две единицы», то есть 111221
111221 читается как «три единицы, две двойки, одна единица», то есть 312211

Напишите алгоритм, который определяет n-й член последовательности. Входные данные: n — натуральное число от 1 до 30 включительно.

Вывод: n-й член последовательности.

Пример:

1. n = 1

Output: 1

2. n = 4

Output: 1211


Разбор
Идея простая, для генерации n-го члена мы генерируем предыдущие n-1, зная начальное значение для n=1. Необходимо отслеживать кол-во последовательных символов и ставить это число перед самим символом. Все детали смотрите в реализации.

Реализация

using System;
using System.Collections.Generic;

public class Program
{
public static string CountAndSay(int n)
{
if (n == 1)
{
return "1";
}

var arr = new List<byte>() { 1 };
for (int i = 2; i <= n; i++)
{
byte count = 1;
int len = arr.Count;
var val = arr[0];
var newNumber = new List<byte>();

for (int j = 1; j < len; j++)
{
if (arr[j] == val)
{
count++;
}
else
{
newNumber.Add(count);
newNumber.Add(val);
count = 1;
}

val = arr[j];
}

if (count > 0)
{
val = arr[len - 1];
newNumber.Add(count);
newNumber.Add(val);
}

arr = newNumber;
}

return string.Join("", arr);
}

public static void Main()
{
Console.WriteLine("UniLecs");

Console.WriteLine(CountAndSay(4)); // 1211
Console.WriteLine(CountAndSay(5)); // 111221
Console.WriteLine(CountAndSay(6)); // 312211
}
}


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

@csharp_ci
Please open Telegram to view this post
VIEW IN 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