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

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

@ai_machinelearning_big_data - Machine learning

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

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

@pythonlbooks- книги📚

Реестр РКН: https://clck.ru/3Fk3kb
Download Telegram
🧬Orleans

Orleans - это кросс-платформенная платформа для создания надежных, масштабируемых распределенных приложений

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

@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
💡Задача "Самый короткий мост"

Условие: на вход подается матрица, в которой 1 - суша, 0 - вода.

Остров представляет из себя совокупность частей суши, соединенных в четырех направлениях. На решетке существуют только два острова.

Можно изменить 0 на 1 для соединения двух островов в один.

Необходимо посчитать количество смен нулей на единицу для соединения двух островов.

Пример:

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

Объяснение:

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

Решенние:

public class Solution {
public IList<int> SpiralOrder(int[][] matrix) {
List<int> lst = new();
int m = matrix.Length;
int n = matrix[0].Length;
int max = (int)Math.Ceiling(Math.Min(m,n)/2.0);
for(int index=0; index< max; index++){
if(m - index * 2 == 1 || n - index * 2 == 1) {
for(int i=index; i<m-index; i++)
for(int j= index; j<n-index; j++)
lst.Add(matrix[i][j]);
continue;
}

for(int i=index; i<n-index-1; i++)
lst.Add(matrix[index][i]);
for(int i=index;i<m-index-1; i++)
lst.Add(matrix[i][n-1-index]);
for(int i=n-1-index; i>index; i--)
lst.Add(matrix[m-1-index][i]);
for(int i=m-1-index; i>index; i--)
lst.Add(matrix[i][index]);
}

return lst;
}
}

Временная сложность:
O(mn)

Пространственная сложность:
O(nm)

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

@csharp_ci
🧬CefSharp

CefSharp - библиотека, которая позволяет встраивать Chromium в приложения .NET. Это легкая обертка .NET вокруг Chromium Embedded Framework (CEF) Маршалла А. Гринблатта. Около 30% связки написано на C++/CLI, а большая часть кода - на C#. Его можно использовать из C# или VB, или любого другого языка CLR.

🖥 Github

@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
💡Задача: Сортировочный список

Условие: дан односвязный список, необходимо отсортировать узлы списка по значению в порядке возрастания

Пример:

Ввод:
head = [4,2,1,3]
Вывод: [1,2,3,4]

Ввод: head = [-1,5,3,4,0]
Вывод: [-1,0,3,4,5]

Можете ли вы отсортировать связанный список за O (n logn) времени и O(1) памяти (т.е. постоянного пространства)?

Решение:

public class Solution
{
public ListNode SortList(ListNode head)
{
if (head == null)
return null;

if (head.next == null)
return head;

var tail = head;
var mid = head;
var prev = head;

while (tail != null && tail.next != null)
{
tail = tail.next.next;
prev = mid;
mid = mid.next;
}
prev.next = null;

return MergeTwoLists(SortList(head), SortList(mid));
}

ListNode MergeTwoLists(ListNode list1, ListNode list2)
{
var head = new ListNode();
var newNode = head;

while (list1 != null && list2 != null)
{
if (list1.val < list2.val)
{
newNode.next = list1;
newNode = list1;
list1 = list1.next;
}
else
{
newNode.next = list2;
newNode = list2;
list2 = list2.next;
}
}

newNode.next = list1 ?? list2;

return head.next;
}
}

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

@csharp_ci
📎Plugin.Maui.ScreenSecurity

Полезная библиотека для защиты приложений NET MAUI без особых усилий. Помогает скрыть контент приложения, поставить защиту от скриншотов и записи экрана.

🖥 Github

@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Threading: Небольшая памятка с кодом.

Создание нового потока
Чтобы создать новый поток в C#, вы можете использовать класс Thread:

using System.Threading;

void PrintNumbers()
{
for (int i = 1; i <= 5; i++)
{
Console.WriteLine(i);
}
}

Thread newThread = new Thread(PrintNumbers);

Starting a Thread
Чтобы запустить поток в C#, вы можете использовать метод Start():

newThread.Start();

Joining a Thread
Чтобы дождаться завершения выполнения потока в C#, вы можете использовать метод Join()

newThread.Join();


Thread Sleep
Остановка текущего потока на заданное время,

Thread.Sleep(1000); // Sleep for 1 second

Thread Pools
Чтобы использовать пул потоков в C#, вы можете воспользоваться классом ThreadPool:

using System.Threading;

ThreadPool.QueueUserWorkItem(PrintNumbers);

Tasks
Чтобы создать и запустить задачу в C#, вы можете использовать класс Task:

using System.Threading.Tasks;

Task.Run(PrintNumbers);

Wait
Чтобы дождаться завершения задачи в C#, вы можете использовать метод Wait():

Task task = Task.Run(PrintNumbers);
task.Wait();


Cancelling a Task
Для отмены задачи в C# можно использовать класс CancellationTokenSource:

using System.Threading;
using System.Threading.Tasks;

CancellationTokenSource cts = new CancellationTokenSource();
Task.Run(() => PrintNumbers(cts.Token), cts.Token);
cts.Cancel();


Task Exceptions
Для обработки исключений в задаче можно использовать блок try-catch внутри :

using System.Threading.Tasks;

Task.Run(() =>
{
try
{
// Code that may throw an exception
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
});


@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
💡Задача: Быки и коровы

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

Быки - правильные цифры, находящиеся на нужных позициях.

Коровы - правильные числа, но находящиеся на соответствующих позициях.

Задача - выдать подсказку в формате "xAyB", где x - количество быков, y - количество коров.

Пример:

Ввод:
secret = "1807", guess = "7810"
Вывод: "1A3B"

Объяснение:

Ввод:
secret = "1123", guess = "0111"
Вывод: "1A1B"

Решение:

public class Solution {
public string GetHint(string secret, string guess) {
// Store the frequency of secret
var freq = new Dictionary<char,int>();
int bulls=0;
for(int i=0;i<secret.Length;i++){
if(!freq.ContainsKey(secret[i]))
freq[secret[i]]=1;
else
freq[secret[i]]++;
}
// Find the no of bull first and reduce the secret count..
int cows=0;
for(int i=0;i<secret.Length;i++){
if(secret[i]==guess[i]){
bulls++;
freq[secret[i]]--;
}
}
// for cows, check if the character not matching and if its required
for(int i=0;i<secret.Length;i++){
if(secret[i]!=guess[i]){
if(freq.ContainsKey(guess[i]) && freq[guess[i]]>0){
cows++;
freq[guess[i]]--;
}
}
}

return bulls+"A"+cows+"B";

}
}


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

@csharp_ci
Список 500 популярных вопросов и ответов с собеседований C# csharp

Github

@csharp_ci
Что выведет код ?

using System;
using System.Text;
public class Program
{
public static void Main(string[] args)
{
String str = "";

StringBuilder sb1 = new StringBuilder("TechBeamers");
StringBuilder sb2 = new StringBuilder("TechBeamers");
StringBuilder sb3 = new StringBuilder("Welcome");
StringBuilder sb4 = sb3;

if (sb1.Equals(sb2)) str += "1";
if (sb2.Equals(sb3)) str += "2";
if (sb3.Equals(sb4)) str += "3";


String str1 = "TechBeamers";
String str2 = "Welcome";
String str3 = str2;

if (str1.Equals(str2)) str += "4";
if (str2.Equals(str3)) str += "5";
Console.WriteLine(str);
}
}


Ответ
📎Полезные инструменты: Command-line-api

Этот репозиторий содержит код для библиотек System.CommandLine и глобального инструмента dotnet-suggest.

🖥 Github

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

using System;
public class Program
{
public static void Main(string[] args)
{
Console.WriteLine("H" + 'I');
Console.WriteLine('h' + 'i');
}
}
Что выведет код?
Anonymous Quiz
62%
a) HI hi
6%
b) 145 209
29%
c) HI 209
3%
d) 145 hi
🖇TensorFlow.NET

Связка .NET Standard для TensorFlow от Google для разработки, обучения и развертывания моделей машинного обучения на C# и F#.

Github
Обучающая Статья

@csharp_ci
Что выведет код?

using System;
class Program
{
static void Main(string[] args)
{
double num1 = 1.000001;
double num2 = 0.000001;
Console.WriteLine((num1 - num2) == 1.0);
}
}


@csharp_ci
Что выведет код?
Anonymous Quiz
47%
a) True
41%
b) False
4%
c) Null
8%
d) Error
🖥 5 полезных методов расширения для Task.

1. Запустить и забыть

Иногда необходимо начать выполнение задачи без ожидания ее окончания, особенно когда результат не критичен. Будем использовать расширенный метод "FireAndForget". При необходимости, мы можем передать обработчик ошибок в метод, который будет вызываться, если задача выдает исключение.

public static void FireAndForget(
this Task task,
Action<Exception> errorHandler = null)
{
task.ContinueWith(t =>
{
if (t.IsFaulted && errorHandler != null)
errorHandler(t.Exception);
},
TaskContinuationOptions.OnlyOnFaulted);
}

Использование:
SendEmailAsync().FireAndForget(
e => Console.WriteLine(e.Message));


2. Повтор

Для повторного выполнения задачи мы можем создать метод Retry, который позволит нам установить максимальное количество попыток и задержку между ними. Он будет работать до выполнения задачи или достижения максимальной попытки.

public static async Task<TResult>
Retry<TResult>(
this Func<Task<TResult>> taskFactory,
int maxRetries,
TimeSpan delay)
{
for (int i = 0; i < maxRetries; i++)
{
try
{
return await taskFactory()
.ConfigureAwait(false);
}
catch
{
if (i == maxRetries - 1)
throw;
await Task.Delay(delay)
.ConfigureAwait(false);
}
}
// не должно достигать этого места
return default(TResult);
}

Использование:
var result = await (
() => GetResultAsync())
.Retry(3, TimeSpan.FromSeconds(1));


3. Действие при сбое

Выполняется в случае возникновения ошибок или исключений при выполнении задачи

public static async Task
OnFailure(this Task task,
Action<Exception> onFailure)
{
try
{
await task.ConfigureAwait(false);
}
catch (Exception ex)
{
onFailure(ex);
}
}

Использование:
await GetResultAsync()
.OnFailure(ex => Console.WriteLine(ex.Message));


4. Установка Тайм-аута

Установка тайм-аута для задачи полезна, когда вы хотите, чтобы задача не выполнялась очень долго.

public static async Task
WithTimeout(this Task task,
TimeSpan timeout)
{
var delayTask = Task.Delay(timeout);
var completedTask = await
Task.WhenAny(task, delayTask)
.ConfigureAwait(false);
if (completedTask == delayTask)
throw new TimeoutException();

await task;
}



Использование:
await GetResultAsync()
.WithTimeout(TimeSpan.FromSeconds(1));


5. Результат по умолчанию

Бывают ситуации, когда нужно вернуть результат по умолчанию при сбое задачи:


public static async Task<TResult>
Fallback<TResult>(
this Task<TResult> task,
TResult fallbackValue)
{
try
{
return await task.ConfigureAwait(false);
}
catch
{
return fallbackValue;
}
}

Использование:
var result = await GetResultAsync()
.Fallback("fallback");


Статья

@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
📌 Найти максимальный подмассив

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

Условие задачи: дан целочисленный массив, необходимо найти в нем такой подмассив, сумма элементов в котором будет максимальной.

Подмассивом называется последовательная часть исходного массива.

Пример:

Ввод:
nums = [-2,1,-3,4,-1,2,1,-5,4]
Вывод:
6

Объяснение:
4,-1,2,1] имеет наибольшую сумму 6.

Ввод:
nums = [5,4,-1,7,8]
Вывод:
23

Решение:

public class Solution {
public int MaxSubArray(int[] nums) {
int res = nums[0], sum = nums[0], i = 1;
while (i < nums.Length)
{
if (nums[i] > nums[i] + sum) sum = nums[i];
else sum = nums[i] + sum;

if (sum > res) res = sum;
i++;
}
return res;
}
}


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

@csharp_ci