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

    WNeZRoS
    @WNeZRoS
    Если Physics.Raycast вернул false, то "Raycast ни во что не врезался".

    В вашем коде надо у первого if добавить else блок, и там напить обработку этого случая.
    Но без дублирования кода будет проще после isWorkThat = true; добавить return;, а содержимое else блока перенести в конец функции после всех if.
    Ответ написан
    Комментировать
  • Можно ли как-то получить доступ к отображающим элементам ToolBar?

    WNeZRoS
    @WNeZRoS
    требуется подсвечивать текущий элемент

    с помощью события нажания


    Лучше не делать таких не явных предположений о текущем элементе, кнопка может быть нажата, но из-за каких-то внутренних условий "текущесть" может не измениться.
    Лучше завести во вью модели флаг о том что он текущий и по нему подсвечивать. Проще всего в той же, для которой ItemTemplate с кнопкой написан.

    Но если хочется более чистого кода, то можно через RelativeSource вылезти во внешнюю вью модель и сделать проверку через мультибининг с конвертером
    <MultiBinding Converter="{StaticResource IsEqualsConverter}">
        <Binding />
        <Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type ToolBar}}" Path="DataContext.CurrentElement" />
    </MultiBinding>


    Если вдруг под подсветить вы имеете в виде не что-то своё хитрое, а фокус, то можно использовать экстеншен с attached dependency property для установки фокуса. В этом случае для определения первого элемента поможет {RelativeSource Mode=PreviousData} - у первого элемента он будет {x:Null}
    Ответ написан
    Комментировать
  • Unity не считывает курсор мыши. Что делать?

    WNeZRoS
    @WNeZRoS
    Было бы понятнее, если бы вы написали что на 13 строке. Скорее всего это строка с Camera.main, а оно может быть null если у объекта камеры не стоит тег MainCamera
    Ответ написан
  • При создании своего UserControl на Avalonia лезут ошибки?

    WNeZRoS
    @WNeZRoS
    Внутри SplitView.Content вероятно надо TransitioningContentControl обернуть в Border что строкой выше, или обернуть их всех в какую-то панель где может быть больше одного элемента.
    Ответ написан
  • Раскрывающийся список с объектами в WPF?

    WNeZRoS
    @WNeZRoS
    То что на картинке выглядит как Expander, в Header у него панель с иконкой и текстом, в Content - DataGrid с таблицей. Если таких экспандеров не фиксированное кол-во, то их можно генерить с помощью ItemsControl
    Ответ написан
    3 комментария
  • Как к поймать событие OnMouseLeftButtonUp из пользовательского элемента UIElement?

    WNeZRoS
    @WNeZRoS
    Чтобы ловить события мыши вне элемента этот элемент должен захватить мышь через Mouse.Capture. Захват надо не забыть отменить когда он уже не актуален, иначе другие элементы не смогут получать события мыши.
    Ответ написан
    Комментировать
  • Почему MouseMove не срабатывает?

    WNeZRoS
    @WNeZRoS
    У Canvas по умолчанию нет фона, соответственно курсору не за что зацепиться и MouseMove уходит окну. Если добавить для канваса Background="Transparent" (прозрачный цвет считается за фон, но визуально ничего не меняет), то всё будет работать.
    Раньше работало видимо потому что в канвасе были визуально видимые элементы.
    Ответ написан
    1 комментарий
  • Что делает IEqualityComparer? Он вообще работает?

    WNeZRoS
    @WNeZRoS
    IEqualityComparer<T> используется в коде с обобщениями (generics).
    Например, он используется для ключей в Dictionary или для сравнения (Equals) элементов в ValueTuple.
    Если бы в Dictionary использовали object.Equals, а не IEqualityComparer<T>, то при сравнении ключей-структур постоянно бы происходил боксинг, что не очень эффективно. (У простых структур всё-равно будет боксинг, чтобы его не было надо реализовать IEquatable).

    Когда у вас уже известен тип большого смысле использовать IEqualityComparer<T> мало, есть более лаконичные вариант для Equals и GetHashCode.
    Ответ написан
  • Как в логике mvvc wpf передать в класс ViewModel из view свойство класса .xaml.cs?

    WNeZRoS
    @WNeZRoS
    Почему это поле не передается через, передается null
    CommandParameter="{Binding ElementName=selfUserControl,Path=Points, Mode=OneWay}">, selfUserControl x:Name элемента.

    Проперти Points должен быть public

    Находил примеры, там везде свойство ItemsSource, но такого свойства нету у Canvas

    Надо использовать ItemsControl, у которого как раз есть ItemsSource, а Canvas использовать как панель для этого ItemsControl через ItemsPanel
    Ответ написан
    Комментировать
  • Как индефицировать объект списка по нажатию кнопки в нём?

    WNeZRoS
    @WNeZRoS
    Если используете команды, то надо у кнопки сделать CommandParameter="{Binding}" и тогда вьюмодель строки придёт в команду.
    Если на Click эвентах, то из аргументов эвента достать кнопку и посмотреть на её DataContext.
    Ответ написан
    Комментировать
  • Почему двумерные массивы работают чуть быстрее одновременых?

    WNeZRoS
    @WNeZRoS
    // [][] 4865
    // [,]  5192
    // []   4852


    int[] - простейший массив, в памяти лежит линейно.
    Работает за счёт IL инструкций (newarr, ldelem, ...), которые могут лучше оптимизировать jit компилятором

    int[,] - многомерный массив, в памяти лежит также линейно как int[].
    Работает через вызовы методов, а так же за счёт не популярности работает на общем коде с массивами где первый элемент может быть не по индексу 0. Соответственно, для доставания элементов требуется дополнительная математика и проверки.

    int[][] - массив массивов, в памяти линейно лежат ссылки на линейно лежащие строки.
    Работает медленнее int[] потому что требуется доступ к другим участкам памяти (строкам).
    Ответ написан
    Комментировать
  • Как получить последние 3 символа строки используя Lambda expression?

    WNeZRoS
    @WNeZRoS
    Попрактиковался в решении задачи "получить последние 3 символа" максимально не эффективным способом.
    Первый вариант самый правильный, чем дальше тем не оптимальнее. Второй больше всего похож на то что у вас вопросе.

    string n2string = "sdfihsdfguhdsfo[ghdfhgdsfhghdfsgdfhghdsfg9wh328932u82hbsab zb cx9832u83232hbnibcz";
    int countMinus3 = n2string.Length - 3;
    
    {
        string lastThreeSymbols = n2string.Substring(countMinus3);
        Console.WriteLine($"lastThreeSymbols = {lastThreeSymbols}");
    }
    {
        string lastThreeSymbols = string.Concat(n2string.Where((_, i) => i >= countMinus3));
        Console.WriteLine($"lastThreeSymbols = {lastThreeSymbols}");
    }
    {
        string lastThreeSymbols = n2string.Where((_, i) => i >= countMinus3).Aggregate(string.Empty, (s, c) => s + c);
        Console.WriteLine($"lastThreeSymbols = {lastThreeSymbols}");
    }
    {
        string lastThreeSymbols = n2string.Aggregate(string.Empty, (s, c) => (s.Length > 2 ? s.Substring(1) : s) + c);
        Console.WriteLine($"lastThreeSymbols = {lastThreeSymbols}");
    }
    Ответ написан
  • Как можно сделать перебор по массиву быстрее?

    WNeZRoS
    @WNeZRoS
    Если было бы больше контекста, то можно было бы что-то увереннее советовать. По этому куску кода можно дать только такие комментарии (считая что Get* методы и итераторы не имеют сайд эффектов):
    var someItems = _someService.GetList();
    foreach (var item in someItems) // item внутри не используется, можно убрать этот foreach
    {
        var additionalItems = _additionItemsSerivce.GetList();
        foreach (var additionalItem in additionalItems)
        {
            var properties = additionalItem.Properties;
            foreach (var property in properties)
            {
                property.First = true;
                property.First = true; // зачем делать одно и тоже два раза?
                _additionItemsSerivce.UpdateProperies(additionalItem); // property не используется, значит можно вынести за этот foreach
            }
        }
    }


    Если по этим комментариям убрать лишнее, получится что-то такое:
    var additionalItems = _additionItemsSerivce.GetList();
    foreach (var additionalItem in additionalItems)
    {
        var properties = additionalItem.Properties;
        foreach (var property in properties)
            property.First = true;
        
        _additionItemsSerivce.UpdateProperies(additionalItem);
    }


    Так же странно что все проперти у вас получают флаг First, возможно вместо foreach по properties стоит получить только первый элемент и ему установить First = true.
    Ответ написан
    Комментировать
  • Как сделать прозрачный фон png фото wpf?

    WNeZRoS
    @WNeZRoS
    Чтобы был прозрачный фон у png в wpf, нужно чтобы у самой png фон был прозрачный, а не серо-белая клеточка.
    Ответ написан
    Комментировать
  • Как загрузить нод на сцену в Godot Mono?

    WNeZRoS
    @WNeZRoS
    $"..." - синтаксический сахар для get_node("...").

    В C# это так будет:
    private Node node;
    
    public override void _Ready()
    {
        node = GetNode<Node>("../Node");
    }
    Ответ написан
    1 комментарий
  • Не освобождается поток или другая причина недоступности файла?

    WNeZRoS
    @WNeZRoS
    Вот так выглядит File.OpenRead:
    public static FileStream OpenRead(string path)
    {
       return new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
    }

    А так конструктор с двумя параметрами для FileStream:
    internal const FileShare DefaultShare = FileShare.Read;
    
    public FileStream(string path, FileMode mode)
        : this(path, mode, mode == FileMode.Append ? FileAccess.Write : FileAccess.ReadWrite, DefaultShare, DefaultBufferSize, DefaultIsAsync) {}


    Собственно главная разница в переданном FileAccess. В случае OpenRead файл открывается только для чтения, а в случае FileStream и на чтение и на запись. Переданный FileShare позволяет только читать файл из нескольких мест, и при открытии с FileAccess.ReadWrite как раз получается ваша проблема (т.к. оно хочет ещё и писать в файл).
    Ответ написан
    Комментировать
  • Как преобразовать тип ReadOnlySpan?

    WNeZRoS
    @WNeZRoS
    Из ReadOnlySpan<byte> можно распарсить число при помощи System.Buffers.Text.Utf8Parser.TryParse
    Пример использования можно увидеть в этой статье.
    Ответ написан
    Комментировать
  • Как реализовать одновременное присваивание и ввод чисел через пробел?

    WNeZRoS
    @WNeZRoS
    Можно сделать так же как в Python:
    var (a, b) = Console.ReadLine().Split(" ").Select(int.Parse);


    но надо добавить метод деконструкции IEnumerable на 2 элемента:
    public static class DeconstructEnumerable
    {
    	public static void Deconstruct<T>(this System.Collections.Generic.IEnumerable<T> enumerable, out T item1, out T item2)
    	{
    		using var enumerator = enumerable.GetEnumerator();
    		if (!enumerator.MoveNext())
    			throw new ArgumentException("not enough values to unpack (expected 2, got 0)", nameof(enumerable));
    										
    		item1 = enumerator.Current;
    										
    		if (!enumerator.MoveNext())
    			throw new ArgumentException("not enough values to unpack (expected 2, got 1)", nameof(enumerable));
    		
    		item2 = enumerator.Current;
    		
    		if (enumerator.MoveNext())
    			throw new ArgumentException("too many values to unpack (expected 2)", nameof(enumerable));
    	}
    }
    Ответ написан
    1 комментарий
  • Почему получаю False при сравнение 2-х одинаковых строк?

    WNeZRoS
    @WNeZRoS
    Всегда можно написать функцию для поиска разницы:
    (int, char, char) FindFirstDifference(string a, string b)
    {
        var length = Math.Min(a.Length, b.Length);
        for (int i = 0; i < length; i++) 
        {
            if (a[i] != b[i])
                return (i, a[i], b[i]);
        }
    
        if (a.Length == b.Length)
            return (-1, '\0', '\0');
    
        return (length, a.Length == length ? '\0' : a[length], b.Length == length ? '\0' : b[length]);
    }


    В теории могут быть визуально похожие unicode символы, но в вашем случае они просто разные.
    Ответ написан
    Комментировать
  • Как сделать чтобы при изменение размера окна кнопки пропорционально изменялись по высоте?

    WNeZRoS
    @WNeZRoS
    StackPanel в Vertical ориентации делает все элементы минимальной высоты.
    Ваш вариант с Grid не работает как нужно потому что Height="*" ставить для второй строки, той которую нужно растянуть.
    Я бы в данном случае использовать DockPanel - в ней (по умолчанию) последний элемент растягивается на весь оставшийся объём.
    Ответ написан
    1 комментарий