Popular Tags:

Создание и публикация nuget пакета

08.01.2019 at 17:18

nuget — это пакетный менеджер для C#. Создавать пакеты можно двумя способами: через Visual Studio и через командную строку. Я выбираю второй, так как его можно использовать на линуксе. Покажу на примере своего проекта ru.lsreg.math.

Сначала нужно зарегистрироваться на nuget.org

После этого добавляем в csproj файл в существующую PropertyGroup несколько свойств

< PackageId>ru.lsreg.math< /PackageId>
< Version>1.0.0< /Version>
< Authors>Mikhail Gubanov< /Authors>
< Company>lsreg.ru< /Company>
< PackageProjectUrl>http://lsreg.ru< /PackageProjectUrl>
< RepositoryUrl>https://github.com/lsreg/ru.lsreg.math< /RepositoryUrl>

Первые 4 обязательны, остальные опциональны. read more

Работа с матрицами на C#. Продолжение.

07.01.2019 at 12:08

Единичная матрица

Единичная матрица — это квадратная матрица, на главной диагонали которой все элементы равны 1, а все остальные элементы равны 0.

Для создания такой матрицы добавим статический метод

public static Matrix CreateIdentityMatrix(int n)
{
    var result = new Matrix(n, n);
    for (var i = 0; i < n; i++)
    {
        result[i, i] = 1;
    }
    return result;
}

По хорошему бы конечно использовать для таких целей именованный конструктор. read more

Детерминант матрицы на C#

28.12.2018 at 22:40

Детерминант (или определитель) матрицы можно вычислить огромным количеством способов. Мы воспользуемся следующей формулой:

где — определитель матрицы, полученной из исходной вырезанием 1 строки и j столбца.

Для начала научимся вырезать из матрицы столбец:

private Matrix CreateMatrixWithoutColumn(int column)
{
    if (column < 0 || column >= this.N)
    {
        throw new ArgumentException("invalid column index");
    }
    var result = new Matrix(this.M, this.N - 1);
    result.ProcessFunctionOverData((i, j) => 
        result[i, j] = j < column ?
read more

Бинарный поиск в C#

19.12.2018 at 14:01

Бинарный поиск — классический алгоритм. На вход алгоритм принимает отсортированный массив чисел и число для поиска. На выходе — индекс этого числа в массиве.

Алгоритмически это выглядит так:

  1. Запоминаем левую L и правую R границы массива (индексы, а не значения)
  2. Берем индекс M посередине между L и R
  3. Если значение массива по индексу M меньше нужного — L меняем на M, если больше — R меняем на M
  4. Возвращаемся на шаг 2

Таким образом мы на каждом шаге алгоритма сужаем область поиска в 2 раза. read more

Работа с матрицами в C#

17.12.2018 at 10:37

Матрица представляет из себя двумерный массив. Для начала создадим класс матрицы

public class Matrix {
    private double[,] data;

    private int m;
    public int M {get => this.m;}
    
    private int n;
    public int N {get => this.n;}
    
    public Matrix(int m, int n) 
    {
        this.m = m;
        this.n = n;
        this.data = new double[m, n];
    }
}

Пока этот класс явлеятся просто оберткой для двумерного массива. read more

Списки в flutter

07.12.2018 at 09:00

Для отображения списков в flutter используется виджет ListView. В свойство children нужно передать массив элементов списка

body: ListView(children: <Widget>[
  ListTile(title: Text('test 1')),
  ListTile(title: Text('test 2')),
  ListTile(title: Text('test 3'))
])

Выглядеть такой виджет будет вот так:

Содержимым ListView могут быть любые виджеты, не только ListTile. ListTile всего лишь подготовленный виджет, хорошо выглядящий в списке и имеющий много полезных свойств, например

ListTile(
  leading: Icon(Icons.work),
  title: Text('test 1'),
  trailing: Icon(Icons.star),
  subtitle: Text('subtitle text'),
  isThreeLine: true,
)

получится такой виджет:

Динамические списки в flutter

Чаще всего содержимое списка не известно заранее. read more

Сериализация и десериализация JSON в flutter для больших проектов

06.12.2018 at 08:14

В прошлой статье я рассказывал о получении JSON по HTTP и десериализации ответа. Парсинг JSON был сделан вручную. Такой вариант подходит для маленьких проектов, разрабатываемых в одиночку, но вызовет множество проблем в более крупном проекте.

Для крупных проектов разбор JSON лучше генерировать. Используется для этого пакет json_serializable.

В файле pubspec.yaml в секцию dependencies добавляем

json_annotation: ^2.0.0

А в секцию dev_dependencies

build_runner: ^1.0.0
json_serializable: ^2.0.0

dev_dependencies — это зависимости, которые используются в процессе разработки но не используются в production коде. read more

flutter: получение JSON по HTTP и парсинг ответа

04.12.2018 at 09:12

Для работы с http в dart нужно подключить пакет http. Для этого в файл pubspec.yaml в секцию dependencies добавляем строчку

http: ^0.12.0

После этого загружаем пакет командой

flutter packages get

В файле подключаем импорты

import 'package:http/http.dart' as http;
import 'dart:convert';

Второй импорт нужен будет для парсинга JSON из строки ответа.

Создаем класс с данными (в примере это данные пользователя)

class User {
  final int id;
  final String name;
  final String email;

  User({this.id, this.name, this.email});

  factory User.fromJson(Map<String, dynamic> json) {
    return User(
      id: json['id'],
      name: json['name'],
      email: json['email']
    );
  }
}

В классе User сделана фабрика для создания пользователя из JSON. read more

Шум Перлина на C#

09.06.2018 at 11:39

Шум Перлина — алгоритм генерации текстур, который придумал Кен Перлин в 1983 году. Позже он улучшил свой алгоритм, который теперь так и называется — улучшенный шум Перлина.
Особенность такой генерации в том, что шум Перлина генерирует случайные числа для любой точки пространства, но случайные значения отличаются незначительно для точек, находящихся недалеко друг от друга. read more

Работа с изображениями в .Net Core

07.06.2018 at 10:58

Главная проблема в обработке изображений на C# под линуксом — отсутствие System.Drawing. В качестве альтернативы есть несколько сторонних библиотек, сегодня рассмотрим одну из них — ImageSharp.

Для начала работы нужно подключить два пакета: SixLabors.ImageSharp и SixLabors.ImageSharp.Drawing. Актуальная на момент написания статьи версия — 1.0.0-beta0004.

Теперь подключаем необходимые пространства имен и можно начинать работать

using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Processing;
using SixLabors.ImageSharp.Processing.Drawing;
using SixLabors.Shapes;

Создаем изображение нужного нам размера

var image = new Image<Rgba32> (500, 500);

Все изменения изображения происходят с помощью метода Mutate

image.Mutate (ctx => ctx.Fill(Rgba32.White));

ctx здесь — объект, реализующий интерфейс IImageProcessingContext, который позволяет обрабатывать изображение и имеет fluent интерфейс. read more