Ответы пользователя по тегу C#
  • Как улучшить алгоритм?

    Добавлю свой вариант решения.
    Всё чётко по условию задачи
    // (1)     (2)      (3)     (4)     (5)     (6)     (7)     (8)     (9)
    // 1   2 | 5   6 | 9  10 | 13 14 | 17 18 | 21 22 | 25 26 | 29 30 | 33 34 |
    // 3   4 | 7   8 | 11 12 | 15 16 | 19 20 | 23 24 | 27 28 | 31 32 | 35 36 |
    // 54 53  52  51   50 49   48 47   46 45   44 43   42 41   40 39   38 37
    
    public int GetRoomByPlace(int place) =>
        place < 37
            ? (place - 1) / 4 + 1
            : 9 - (place - 37) / 2;
    Ответ написан
    1 комментарий
  • Как округлить до минималки?

    Если привести float или double к int, то дробная часть будет отброшена.
    Так что если тебе уж очень не нравится поведение Math.Floor
    var number = 1.999;
    var floored = (int) number;
    Assert.Equal(1, floored);
    Ответ написан
    Комментировать
  • Как сделать из этого метода нормальный код?

    Код в целом норм, если не упарываться в Linq.
    Использовать linq не советую, тк он заметно медленнее и потребляет больше памяти, чем циклы.

    Если рефакторить, то целиком, включая GridRepository.
    Например можно зная текущую клетку и оффсет найти за O(1) все нужные клетки и отбросить занятые.
    Ответ написан
  • Как пeредать const char* в c++ фунцию из c#?

    www.pinvoke.net/default.aspx/kernel32.GetShortPathName
    Можно использовать MarshalAs
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError=true)]
    static extern uint GetShortPathName(
       [MarshalAs(UnmanagedType.LPTStr)]
       string lpszLongPath,
       [MarshalAs(UnmanagedType.LPTStr)]
       StringBuilder lpszShortPath,
       uint cchBuffer);

    const char* - это UnmanagedType.LPStr и его можно использовать на string и StringBuilder
    Ответ написан
    Комментировать
  • Как написать nUnit тест для ASP.NET контроллера, работающего с Task?

    Зависит от того, какую библиотеку для моков вы используете, но, скорее всего:
    1. в верхнем моке пишешь, с каким аргументом ожидается вызов метода этого сервиса
    2. затем вызываешь метод контроллера с каким-то параметром (какой хочешь протестировать)
    3. В конце делаешь ассерты, с помощью которых ты можешь убедиться, что у тебя всё сработало как надо.

    В этом случае так:
    var user = new User();
    
    var mock = new Mock<IUserService>();
    mock.Setup(service=>service.Add(user)); 
    var controller = new UsersController(mock.Object);
    
    var result = (OkObjectResult) await controller.Add(user); // await не забываем
    
    Assert.Equals(user, result.Value); // Ассерт, что контроллер вернул что ожидали
    mock.Verify(x=>x.Add(user)); //Ассерт, что был вызван метод мока
    Ответ написан
  • Как создать правильную иерархию в asp.NET Core MVC?

    Какого-то единого подхода нет, так что расскажу, как делаю я (но не в MVC проектах)

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

    В aspnet проекте иерархию уже выстраиваю от путей запросов.
    Тоесть если у меня будет эндпоинт GET /api/v1/orders, то и лежать он будет в папке api/v1/

    В MVC будет аналогично, только добавятся ещё razor файлы и css
    css лучше держать рядом с шаблонами, в которых они используются
    Ответ написан
    6 комментариев
  • Как передать List в c#?

    в с# нет map, а есть словари. но если я делаю attribureValues словарем (ключ-значение), то выходит ошибка:
    невозможно преобразовать тип dictionary в тип mapEntryStringString.

    А с чего вы взяли, что нужно туда пихать Dictionary, если там написано mapEntryStringString?
    Просто пишите new mapEntryStringString() и пихайте туда все параметры нужные.
    Скорее всего, там просто список из пар ключ-значение.
    Ответ написан
    Комментировать
  • Во время Rest запроса появляются символы?

    string UTCg = UTC[0].Replace(":","%3A");
    Просто убери эту и другие строки, где руками происходит экранирование.
    При отправке запроса, http-клиент сам всё экранирует как надо.
    Ответ написан
    Комментировать
  • Поместить данные из массива в строку?

    Object reference not set to an instance of an object

    Где-то возник null.
    Ответ написан
    Комментировать
  • Как правильно разделить строки?

    Сложно сказать, откуда берётся NRE, тк код хоть и страшный, но рабочий.
    Ошибка может возникать, если OFD, OFD.FileName, logins или pass равен null.

    Небольшой совет, как можно улучшить код:
    1. Делаем отдельный тип для пары логин-пароль, и используем для этого один список
    2. Читаем файл не целиком, а построчно.
    var path = "...";
    var lines = await File.ReadAllLinesAsync(path);
    var allCredentials = lines.Select(Credentials.Parse).ToList();
    
    public record Credentials(string Username, string Password) {
      public static Credentials Parse(string line) {
          var parts = line.Split(':');
          return new(parts[0], parts[1]);
      }
    }
    Ответ написан
    Комментировать
  • Как правильно задать Bitmap.UriSource для Image.Source?

    1. UriSource принимает путь относительно рабочей директории, а не абсолютный путь
    2. Разделитель - обычный слеш (/), а не обратный (\)
    Но мне нужно, что бы путь ссылался на уже скомпилированную директорию

    Просто выставьте в свойствах к картинке, чтобы она копировалась в скомпилированную директорию.

    https://docs.microsoft.com/en-us/dotnet/api/system...
    Ответ написан
  • Почему появляется ошибка?

    Потому что нет перегрузки, которая принимает string[] и int32
    https://docs.microsoft.com/en-us/dotnet/api/system...

    Но зато есть перегрузка, которая принимает string[], int32, StringSplitOptions
    var a = "TOM";
    var parts = a.Split(new [] { "O" }, 2, StringSplitOptions.None);
    Ответ написан
    Комментировать
  • Как передать значения?

    Используй поля
    Ответ написан
    Комментировать
  • Как скомпилировать проект на C# в один .exe файл?

    Single File Application - фича современных дотнетов со времён .net Core 3
    Буквально при помощи одной опции в файле проекта или одной строкой в консоли собирает ваш проект в единый екзешник, в который ещё может быть опционально встроен рантайм.
    Вот пример csproj:
    <Project Sdk="Microsoft.NET.Sdk">
      <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>net6.0</TargetFramework>
        <Nullable>enable</Nullable>
      </PropertyGroup>
    
      <PropertyGroup>
        <!-- Вот это самое главное -->
        <PublishSingleFile>true</PublishSingleFile>
        <!-- Это чтобы тащить за собой рантайм До .NET 6 будут рядом лежать нативные библиотеки jit-а и сборщика мусора-->
        <SelfContained>true</SelfContained>
        <!-- Это необходимо, чтобы сборщик понимал, для какой ОС нужен экзешник -->
        <RuntimeIdentifier>win-x64</RuntimeIdentifier>
        <!-- Это чтобы ускорить запуск -->
        <PublishReadyToRun>true</PublishReadyToRun>
        <!-- Эти две строки, чтобы уменьшить размер бинарника -->
        <PublishTrimmed>true</PublishTrimmed>
        <TrimMode>link</TrimMode>
      </PropertyGroup>
    </Project>

    В результате получается единственный exe, который реально можно запустить где угодно, вне зависимости от установленной версии .NET

    Для старых версий дотнета есть ILMerge и Costura.Fody, но в .net 5+ они не нужны, и я крайне советую использовать именно .NET 8, тк он сейчас самый актуальный
    Ответ написан
  • Как сделать список ключ-значение в C#?

    Ну в общем , в пайтоне есть такие списки когда ты делаешь название элемента списка (например "имя") и напротив него через : что то для этого элемента (например "Егор")

    Если не ошибаюсь, в пайтоне это называется Словарь/dict/dictionary, но синтаксис немного не такой, какой вы показали.

    В C# это тоже называется Dictionary
    using System.Collections.Generic;
    //...
    var skinPrices = new Dictionary<string, int> {
      ["Очень редкий скин"] = 100500
      ["Очень не редкий скин"] = 1
    };
    Ответ написан
    Комментировать
  • Как десериализовать Json в объект?

    #r "nuget:Newtonsoft.Json/13.0.1"
    
    using Newtonsoft.Json;
    
    var json = @"
    {
        ""success"": 1,
        ""result"": {
            ""total"": 3,
            ""limit"": 0,
            ""offset"": null,
            ""stocks"": [
                {
                    ""номенклатураGUID"": ""GUID"",
                    ""складGUID"": ""GUID"",
                    ""назначениеGUID"": ""GUID"",
                    ""остаток"": 1,
                    ""rn"": 1
                },
                {
                    ""номенклатураGUID"": ""GUID"",
                    ""складGUID"": ""GUID"",
                    ""назначениеGUID"": ""GUID"",
                    ""остаток"": 65,
                    ""rn"": 2
                },
                {
                    ""номенклатураGUID"": ""GUID"",
                    ""складGUID"": ""GUID"",
                    ""назначениеGUID"": ""GUID"",
                    ""остаток"": 13,
                    ""rn"": 3
                }
            ]
        }
    }
    ";
    // Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse); 
        public class Stock
        {
            [JsonProperty("номенклатураGUID")]
            public string НоменклатураGUID { get; set; }
    
            [JsonProperty("складGUID")]
            public string СкладGUID { get; set; }
    
            [JsonProperty("назначениеGUID")]
            public string НазначениеGUID { get; set; }
    
            [JsonProperty("остаток")]
            public int Остаток { get; set; }
    
            [JsonProperty("rn")]
            public int Rn { get; set; }
        }
    
        public class Result
        {
            [JsonProperty("total")]
            public int Total { get; set; }
    
            [JsonProperty("limit")]
            public int Limit { get; set; }
    
            [JsonProperty("offset")]
            public object Offset { get; set; }
    
            [JsonProperty("stocks")]
            public List<Stock> Stocks { get; set; } //Вот тут у вас просто Stock
        }
    
        public class Root
        {
            [JsonProperty("success")]
            public int Success { get; set; }
    
            [JsonProperty("result")]
            public Result Result { get; set; }
        }
    
    var result = JsonConvert.DeserializeObject<Root>(json);

    Буквально после кодогенератора всё ок работает.
    Ответ написан
    Комментировать
  • Как создать Bitmap большого размера в C#?

    Ну во-первых точно не получится использовать стандартный Bitmap.
    Хранить в куче такой большой объект тоже не следует, тк он 100% попадёт в LOH
    + в .NET есть ограничение в 2гб на объекты в управляемой куче.
    Описанное вами изображение как раз в этот лимит и не влезет.

    Остаётся два с половиной варианта:
    1. Делить огромное изображение на чанки по меньше (либо по пикселям, либо по каналам, либо и так и так)
    2. Хранить изображение в неуправляемой памяти, выделять и освобождать память вручную.
    В .net 6 как раз добавили Native alloc API для этого.
    3. Возможно есть какая-нибудь нативная библиотека для работы с большими изображениями.
    Возможно даже уже есть обёртка для работы с ней.

    Во всех случаях придётся отказаться от Bitmap и использовать другие подходы
    без доп. библиотек и массива битмапов

    Не получится
    Ответ написан
    9 комментариев
  • Как указать класс в c#?

    Вы компилируете единственный файл.
    Советую поставить .NET SDK и создать через него проект при помощи dotnet new console.
    612e4e667faf5150731479.png

    csc не следует использовать напрямую
    Ответ написан
    Комментировать
  • Какие задачи по паттернам проектирования на C# вы можете посоветовать?

    У контура есть не самый новый, но достаточно объёмный курс по паттернам на практике:
    https://ulearn.me/Course/CS2/Vvedenie_7df81bac-f52...
    Ответ написан
    Комментировать
  • Сложение элементов массива?

    При этом число с индексом 2 не учитывается в сумме, а 4 учитывается

    Тоесть с 3 до 4 включительно.
    var numbers = [1,-3,5,-6,-10,13,4,-8];
    var sum = numbers[3..4].Sum();
    Ответ написан
    Комментировать