воскресенье, 3 ноября 2019 г.

double

https://docs.microsoft.com/ru-ru/dotnet/api/system.single?view=netframework-4.8#testing-for-equality

Самые ходовае int и double.
Сравнить можно 2 способами, через «эпсилон» и приведением к int.
Например,
1)
double a=100,219999999999999999;
double b=100,220000000000000001;
double c=0,0001; //любая нужная точность
if(fabs(a-b)<c) {} //если равны, то ...

2)
int a=int(100,219999999999999999*100+0,01);
int b=int(100,220000000000000001*100+0,01);
if(a==b) {} //если равны, то…

Напрямую сравнивать на  = вещественные числа неправильно. Должно быть так:
f_eps = 0.000001
abs(c.low-unit.t.y)<f_eps
И да, нет смысла переходить с float(или double) на decimal.

Есть стандарты MISRA и CERT по надёжному программированию. Тупое следование их рекомендациям уберет 99% потенциальных ошибок.

https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9A%D1%8D%D1%85%D1%8D%D0%BD%D0%B0

Попробуй в отладчике на вкладке «Контрольные значения» написать:
c.low.ToString(«F10») и unit.r.y.ToString(«F10»)

Увидишь значения не с двумя знаками после запятой, а с 10. Может оно действительно меньше при использовании float.

Можешь попробовать использовать double. Он использует 64 бита на число(у float 32 бита).

Выше рекомендовали адаптировать сравнение:
вместо «c.low <= unit.r.y» использовать «c.low <= unit.r.y + Epsilon», где Epsilon константное значение, заданное тобой. Выбирается исходя из того, какая точность тебя устраивает. Если цена в долларах(т.е. 59.15 — это $59.15), то можешь попробовать Epsilon = 0.001d.


понедельник, 21 октября 2019 г.

soa

В сервисной архитектуре сложность поддержки растёт экспоненциально с количеством сервисов. Я дам вам инструмент, который позволит значительно замедлить рост этой сложности. Мы поговорим, что можно считать платформой для межсервисного взаимодействия, как она может уже сейчас помочь вам решить проблемы с «наблюдаемостью» сервисов и увеличить надёжность системы, уменьшить объем рутины и снизить Time To Market.

Обсудим плюсы и минусы актуальных протоколов прикладного уровня. Расскажу, почему gRPC — «не вариант», и с какими проблемами вы столкнётесь, если начнёте его использовать.

Доклад будет интересен как тем, кто только начинает свой путь в SOA, так и тем, кто уже хорошо знаком с инструментами OpenAPI, Swagger, gRPC, protobuf. Авторизация запросов, трассировка и логирование, A/B-тестирование, сегментация фич — как получить всё то, что так легко давалось нам в монолите?

четверг, 17 октября 2019 г.

Predicate

https://stackoverflow.com/questions/14297633/c-sharp-pass-lambda-expression-as-method-parameter
public static void Method(Expression<Func<int, bool>> predicate) { 
    int[] number={1,2,3,4,5,6,7,8,9,10};
    var newList = from x in number
                  .Where(predicate.Compile()) //here compile your clausuly
                  select x;
                newList.ToList();//return a new list
    }
Calling method
Method(v => v.Equals(1));
public List<IJob> getJobs(/* i want to pass the lambda expr in here */) {
  using (SqlConnection connection = new SqlConnection(getConnectionString())) {
    connection.Open();
    return connection.Query<FullTimeJob, Student, FullTimeJob>(sql, 
      (job, student) => {         
        job.Student = student;
        job.StudentId = student.Id;
        return job;
        },
        splitOn: "user_id",
        param: parameters).ToList<IJob>();   
  }   
public string Name {get;set;}

public static List<Class> GetList(Expression<Func<Class, bool>> predicate)
    {
        List<Class> c = new List<Class>();
        c.Add(new Class("name1"));
        c.Add(new Class("name2"));

        var f = from g in c.
                Where (predicate.Compile())
                select g;
        f.ToList();

       return f;
    }
Calling method
Class.GetList(c=>c.Name=="yourname");

понедельник, 14 октября 2019 г.

Serialization/DeSerialization List

https://stackoverflow.com/questions/608110/is-it-possible-to-deserialize-xml-into-listt

https://docs.microsoft.com/ru-ru/dotnet/standard/serialization/controlling-xml-serialization-using-attributes

private void Serialize<T>(XDocument doc, List<T> paramList)
        {
            var serializer = new System.Xml.Serialization.XmlSerializer(paramList.GetType());
            var writer = doc.CreateWriter();
            serializer.Serialize(writer, paramList);
            writer.Close();
        }

        private List<T> Deserialize<T>(XDocument doc)
        {
            var serializer = new System.Xml.Serialization.XmlSerializer(typeof(List<T>));
            var reader = doc.CreateReader();
            var result = (List<T>)serializer.Deserialize(reader);
            reader.Close();
            return result;
        }

https://docs.microsoft.com/ru-ru/dotnet/standard/serialization/examples-of-xml-serialization