• Я сделал Code Review, может быть я где-то ошибся или у вас есть что добавить?

    @Sing303
    Опишу, как бы комментировал я
    public sealed class DataProvider : IDisposable
    {
        // nit: Предложил бы названия firstValue, secondValue либо более осмысленные, если возможно
        public extern int LongRunningCalculation(int value, int value2);
        public extern void Dispose();
    }
    
    // nit: сразу бы хотелось видеть уровень доступа и sealed (если класс не планируется наследовать)
    // Class2 - дать нормальное имя
    // { - перенести на 2ю строку по рекомендациям code style от microsoft (если не принято иных)
    class Class2 {
        // Синхронизация не нужна, если убрать метод Init, а Create вызвать в статическом конструкторе
        private readonly object _sync = new object();
        
        // _ht - дать осмысленное название
        // Судя по использованию, value может быть int`ом. Не зачем иметь лишний boxing и проверки на тип
        // _ht статический, значит к нему могут быть обращения из разных потоков, лучше сделать его ConcurrentDictionary
        // Прям сходу не могу сказать, но, возможно, использовал бы какой то другой тип Dictionary <key, key, val> (самописный или существующий), кажется, так было бы быстрее чем массив в ключе
        private static Dictionary<int[], object> _ht; 
    
        // nit: хотелось бы имена со смыслом
        public int GetValue(int index, int index2)
        {
            // Лишний метод, удалить. Create вызовем в static конструкторе
            Init();
            // Если ключ у нас объект, то необходимо реализовать IEqualityComparer для этого Dictionary (иначе не понятно как по нему искать)
            var key = new[] {index, index2};
            // Проверка на тип не нужна, Dictionary сделаем типа int
            if (_ht.ContainsKey(key) & _ht[key].GetType() == typeof(int))
                // приведение типов больше не нужно
                return ((int)_ht[key]);
            // nit: else не обязателен
            else
                // int не может быть null, будет ошибка, вернуть либо default, либо возвращаемое значение должно быть int?
                return null;
        }
    
        // Метод удалить, вызовем Create в статическом конструкторе без lock
        public void Init() 
        {
            if (_ht == null)
                lock (_sync)
                    Create();
        }
        
        // Нет смысла делать метод public, сделать private
        public static void Create() 
        {
            // nit: и так видно какой тип создаём, можно использовать var
            // Обернуть в using
            DataProvider provider = new DataProvider();
            
            // Тут следует инициализировать значение _ht, т.к. ранее оно нигде не создаётся
            // Не забыть передать реализацию IEqualityComparer в конструктор
            
            // nit: хотелось бы видеть использование фигурных скобок (если не принят иной code style)
            // nit: вместо int можно var
            // i и j, похоже, несут какой то смысл, можно попробовать придумать нормальное название (иначе не понятно почему 100 и 12, их можно в константы класса)
            // nit: возможно можно использовать Parallel.ForEach
            for (int i = 0; i < 100; i++)
                for (int j = 1; j <= 12; j++)
                    _ht[new [] { i, j }] = provider.LongRunningCalculation(i, j);
        }
    }

    А переписал бы так (если не убирать массив в dictionary)
    public interface IDataProvider : IDisposable
    {
        int LongRunningCalculation(int firstValue, int secondValue);
    }
    
    public sealed class DataProvider : IDataProvider
    {
        public extern int LongRunningCalculation(int firstValue, int secondValue);
        public extern void Dispose();
    }
    
    public sealed class DataProviderService
    {
        public DataProviderService(IDataProvider dataProvider)
        {
            _dataProvider = dataProvider;
        }
    
        private static readonly ConcurrentDictionary<int[], int?> _calculatedCache = new ConcurrentDictionary<int[], int?>(new CalculatedEqualityComparer());
        private readonly IDataProvider _dataProvider;
    
        public int? GetValue(int firstValue, int secondValue)
        {
            var isNotSupportedValues = firstValue > 100 || firstValue < 0 || secondValue < 1 || secondValue > 12;
            if (isNotSupportedValues)
            {
                return null;
            }
    
            var key = new[] { firstValue, secondValue };
            if (!_calculatedCache.TryGetValue(key, out var result))
            {
                result = _dataProvider.LongRunningCalculation(firstValue, secondValue);
                _calculatedCache.TryAdd(key, result);
            }
            
            return result;
        }
    }
    Ответ написан
    5 комментариев
  • Какие наиболее выгодные фриланс-биржи на русском языке?

    @Stalinko Куратор тега Фриланс
    PHP'шник и фрилансер до мозга костей
    Нормальные бывают не биржи, а знания.
    Пока знаний нет, будет высокая конкуренция и демпинг. И никакая биржа не спасёт. Нет такого чудесного поля дураков, где всем подряд раздают вкусные заказы.

    Как знания подтянутся, можно будет уже играть в другом классе, по другому ценнику и с меньшей конкуренцией.
    Ответ написан
    3 комментария
  • Как оптимизировать построение графика?

    Есть несколько техник отрисовки большого количества точек на графике.
    Как известно, если точек графика больше, чем точек на экране (области отображения), при отображении близкие точки сливаются в одну. Эту особенность можно использовать для отрисовки точек на графике. Она поможет ускорить перерисовку графика при интерактивном взаимодействии.
    Второй вариант - это приближенное отображение графика с использованием алгоритмов прореживания точек, например, алгоритм Рамера — Дугласа — Пекера или Largest-Triangle-Three-Buckets.
    Ответ написан
    2 комментария
  • IOS разработка без Mac. Возможно ли?

    karabanov
    @karabanov
    Системный администратор
    Это по меньшей мере неудобно, ты вместо разработки будешь бороться с инструментами для разработки, чтобы заставить их хоть как-то работать.
    Ответ написан
    3 комментария
  • Можно ли совмещать программирования с трейдингом или лучше выбрать что то одно?

    @AlexSku
    не буду отвечать из-за модератора
    Идти в программирование. Трейдинг - хобби.
    Ответ написан
    2 комментария
  • На каком я сейчас уровне?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    1. Не умеешь пользоваться гитом, тк загрузил файлы через Upload
    2. Код невозможно проверить, тк ты закинул только cs файлы, но не приложил не менее важный csproj - не разбираешься, как собирается проект.
    3. Про свич кейс тебе уже сказали в комменте.
    Про остальное мало что можно сказать - код самый обычный, на три с минусом, не очень хороший, но и не слишком ужасный.
    С архитектурой плохо, тк детали реализации смешаны с бизнес-правилами.
    По алгоритмам нельзя оценить, тк никаких сложных алгоритмов в твоём проекте нет.

    Уровень, имхо: стажёр/младший разработчик(обязательно под менторством и наблюдением более опытного)
    Ответ написан
    5 комментариев
  • После какого раздела можно начинать делать маленькие проекты новичку по C#?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Начинать делать какие-то свои небольшие проекты можно в любой момент.
    Например после прохождения переменных, условий, и циклов уже спокойно можешь делать какие-нибудь небольшие утилиты, которые могут тебе что-то посчитать (например квадратное уравнение, что может быть полезно в школе)

    Естественно, после освоения начальных тем ты сможешь делать только что-то очень простое, а если захочешь делать что-то сложное - придётся по пути изучить и более сложные темы.
    Ответ написан
    Комментировать
  • Sip-вызов с использованием xamarin.forms?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Мне было интересно, есть ли у кого-нибудь хороший опыт работы с SDK для Xamarin и что это может быть за SDK.

    Всё просто. Его, по факту, нет.
    Для работы с SIP есть некий SipSorcery
    А для работы с API Asterisk придётся писать что-то своё (и это ужасная боль)
    Ответ написан
    7 комментариев
  • Как в Dictionary обратиться к элементу по индексу?

    ayazer
    @ayazer
    Sr. Software Engineer
    Словарь не гарантирует сохранение порядка, потому если он важен - можно использовать специальный класс
    https://docs.microsoft.com/en-us/dotnet/api/system...

    var dict = new OrderedDictionary();
    dict.Add("test1", 1);
    dict.Add("test2", 2);
    dict.Add("test3", 3);
    
    var first = dict["test1"];
    var second = dict[1];
    
    Console.WriteLine(first); #1
    Console.WriteLine(second); #2
    Ответ написан
    Комментировать
  • Договор о непереманивании: можно ли обойти?

    Zettabyte
    @Zettabyte
    Проф. восстановление данных ▪ Вопрос? См. профиль
    Не стоит делать ничего подобного.
    У вас есть non-compete agreement? Есть. Он подписан? Подписан.
    Не давши слова – крепись, а давши слово – держись. Вот и придерживайтесь подписанного договора.

    Если обман всплывёт, штраф и конфликт между компаниями будут совершенно закономерными. Чёрная метка, которую вы можете в таком случае получить – тоже на 100% заслуженной.

    Берегите репутацию и не начинайте свою карьеру с обмана. Нормальные компании избегают людей с подобными историями в прошлом и совершенно правильно делают.
    Ответ написан
    2 комментария
  • Какие задачи по паттернам проектирования на C# вы можете посоветовать?

    @AndromedaStar
    .Net - monkey
    Я в свое время, когда был студентом, просто написал консольную игру, что-то вроде рпг и специально думал, как я могу применить паттерны, то есть специально их туда внедрял. Сначала было вообще непонятно, зачем нужно это переусложнение, а потом когда я начал добавлять новые фичи, ко мне сразу пришло понимание. В общем, я эту как бы игру раз десять переписывал. Без практики зубрить их бессмысленно. Напишите проект. Удачи.
    Ответ написан
    2 комментария
  • Как правильно сформулировать цену за парсер букмекерской конторы?

    @Stalinko Куратор тега Фриланс
    PHP'шник и фрилансер до мозга костей
    Цена должна выставляться до начала работ. Либо работать по часовой ставке. А теперь остаётся только торговаться в надежде продать то, что вы сделали, подороже.
    $500 - это даже небольшой ценник.
    Ответ написан
    6 комментариев
  • Как решить быстрое закрытие программы?

    Casper-SC
    @Casper-SC
    Программист (.NET)
    Вот так можно написать класс сканер, который получает данные асинхронно. Использовать его можно таким образом в любом типе приложений. Например, в WPF приложение не будет зависать, если, скажем, запустить сканирование по клику на кнопке.

    Обрати ещё внимание на метод с Task.Factory.StartNew и параметром TaskCreationOptions.LongRunning. Для сканирования папок, думаю использовать стоит.
    using System;
    using System.Collections.Generic;
    using System.Threading.Tasks;
    
    namespace ConsoleApp
    {
        class Program
        {
            static async Task Main(string[] args)
            {
                try
                {
                    // Создаём экземпляр класса
                    var scanner = new Scanner();
                    // Вызываем асинхронный метод Scan, метод работает
                    // какое-то время, возвращает результат.
                    var data = await scanner.Scan();
                    foreach (var item in data)
                    {
                        // Выводим на консоль.
                        Console.WriteLine(item);
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex);
                }
            }
        }
    
        public class Scanner
        {
            public Task<List<string>> Scan()
            {
                return Task.Run(async () =>
                {
                    var results = new List<string>();
    
                    for (int i = 0; i < 10; i++)
                    {
                        // Делаем правильную задержку (имитация долгой работы для примера).
                        await Task.Delay(250);
                        // Собираем данные
                        results.Add(DateTimeOffset.Now.ToLocalTime().ToString());
                    }
    
                    return results;
                });
            }
    
            public async Task<List<string>> ScanVersion2()
            {
                return await Task.Factory.StartNew(async () =>
                {
                    var results = new List<string>();
    
                    for (int i = 0; i < 10; i++)
                    {
                        // Делаем правильную задержку (имитация долгой работы для примера).
                        await Task.Delay(250);
                        // Собираем данные
                        results.Add(DateTimeOffset.Now.ToLocalTime().ToString());
                    }
    
                    return results;
                }, TaskCreationOptions.LongRunning)
                    .Unwrap() // Без этого возвращается Task<List<string>>, а не List<string>
                    .ConfigureAwait(false);
            }
        }
    }


    Стоит почитать книгу "Конкурентность в C#. Асинхронное, параллельное и многопоточное программирование"
    Скриншот сделан с видео: https://youtu.be/lh8cT6qI-nA?t=1123

    612185e7a4563153795281.jpeg
    Ответ написан
    1 комментарий
  • Invalid token return и так же invalid token; что делать?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    1. Отложи юнити на полку
    2. установи Visual Studio Community
    3. Изучай C#, пока сообщения об ошибках не станут понятными.
    4. Достань юнити с полки
    5. Настрой юнити так, чтобы можно было писать код в студии, а не в блокноте или встроенном редакторе.

    Удали строчку, где написано
    return transform.rotation;
    Её там быть не должно.
    return можно писать только внутри методов
    Ответ написан
    1 комментарий
  • Invalid token return и так же invalid token; что делать?

    E1ON
    @E1ON
    Programming, Gamedev, VR
    Это потому что вы с тела класса что то возвращаете.
    Ответ написан
    3 комментария
  • C#. Можно ли создать метод, в котором возвращаемый тип будет определятся в самом методе?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    Возвращаемый тип будет зависеть от того, что придёт в ответе от АПИ (несколько вариантов типов, которые будут явно указаны в самом методе).

    Просто сделай класс, в котором будет какой-нибудь флаг, который сообщает о типе контента и N свойств для каждого типа.
    Если у тебя только два типа - результат и ошибка, то используй Either
    https://habr.com/ru/post/267231/
    Ответ написан
    Комментировать
  • Как организовать Update в window forms?

    Casper-SC
    @Casper-SC
    Программист (.NET)
    using System;
    using System.Windows.Forms;
    
    namespace WinFormsApp
    {
        public partial class MainForm : Form
        {
            private readonly Random _random;
            private readonly Timer _timer;
    
            public MainForm()
            {
                InitializeComponent();
    
                _random = new Random();
                _timer = new Timer();
                _timer.Interval = 500;
                _timer.Tick += OnTimerTick;
            }
    
            private void OnFormLoad(object sender, EventArgs e)
            {
                _timer.Start();
            }
    
            private void OnTimerTick(object sender, EventArgs e)
            {
                label.Text = _random.Next(0, 1000).ToString();
            }
        }
    }
    Ответ написан
    Комментировать
  • Как создать локальную базу данных MS SQL?

    @Voland69
    Возьмите SQLite. БД живет в одном файле, EF с ней замечательно работает. Вам даже ничего не придется менять в проекте, только изменить провайдера, указать где база лежит и накатить миграцию.
    Ответ написан
    5 комментариев
  • Как исправить ошибку?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    В какой-то момент ты ввёл в консоль число в неверном формате, о чём и сообщается в ошибке.
    В стактрейсе можно увидеть, что это произошло при вызове Convert.ToInt32 на 42й строке

    System.FormatException: Входная строка имела неверный формат.
    в System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
    в System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
    в System.Convert.ToInt32(String value)
    в Program1.Program.Main() в C:\CSAIO4D\ВК01\CH01\Program1\Program1\Program.cs:строка 42

    Чтобы чуть проще было обрабатывать подобные ошибки, используй int.TryParse, вместо Convert.ToInt32

    int.Parse и Convert.ToInt32 стоит использовать только тогда, когда ты точно знаешь, что ввод всегда будет корректным.
    Ответ написан
    Комментировать
  • Что не так с синусом?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Вы меняете изображение на месте, проходя по нему сверху вниз. Когда ваш синус сдвигает пиксели вниз - вы перетираете все пиксели в столбце самым верхним.

    Надо или копировать с изменениями в новое изображение, или менять направление прохода в зависимости от знака синуса.
    Ответ написан
    5 комментариев