Современный программист — настоящий полиглот. В отличие от своих коллег из прошлого, он знает несколько языков, владеет разными фреймворками и может решать задачи сразу на нескольких платформах. N + 1 совместно с компанией Personify Inc., разрабатывающей сервис Wild Apricot, предлагает читателям попробовать себя в C#. Дерзайте! В конце теста вам нужно будет оставить свою почту — мы пришлем на нее правильные ответы. И лучшие из вас, возможно, смогут присоединиться к проекту Wild Apricot.

Задача 1

Десять «машин» устраивают гонку, но, к сожалению, условия получаются не очень честные, и некоторые стартуют раньше других. Исправьте это.

class Program
    {
        static void Main(string[] args)
        {
            var runs = Enumerable.Range(0, 10)
                                 .Select(x => new Car())
                                 .Select(c => c.Race())
                                 .ToArray();
            Task.WhenAll(runs);
        }
    }

    public class Car
    {
        public async Task Race()
        {
            var rnd = new Random();
            var time = rnd.Next(10000) + 1;
            await Task.Delay(TimeSpan.FromMilliseconds(time));
            Console.WriteLine($"raced in {time} ms!");
        }
    }
Задача 2

У вас есть простейший aspnet core 2.1 веб-сервис, который на любой запрос возвращает текст RFC3339. Вы планируете хостить его на одной ubuntu 18.04 виртуальной машине и выдавать 200 rps. К сожалению, в нем есть проблема, вам предстоит ее исправить.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.Use(async (context, next) =>
    {
        using (var client = new HttpClient {BaseAddress = new Uri("https://www.ietf.org/")})
        {
            var result = await client.GetAsync("rfc/rfc3339.txt");
            await context.Response.WriteAsync(await result.Content.ReadAsStringAsync());
        }

        await next();
    });
}
Задача 3

Вам достался Asp.NET WebAPI сервис, в котором одна ручка, и она дедлочит на каждый запрос. Поправьте строку #5, чтобы это исправить.

public static async Task GetJsonAsync(Uri uri)
{
  using (var client = new HttpClient())
  {
    var jsonString = await client.GetStringAsync(uri);
    return JObject.Parse(jsonString);
  }
}


public class MyController : ApiController
{
  public string Get()
  {
    var jsonTask = GetJsonAsync(...);
    return jsonTask.Result.ToString();
  }
}
Задача 4

По наследству вам досталась MSSQL база ,в которой много бизнеслогики написано в хранимых процедурах. Одна из них — [dbo].[AwesomeGet] — принимает на вход табличный параметр с одной колонкой ID int. База находится на последнем издыхании, и вам нужно минимизировать нагрузку на нее. Какой вариант вызова процедуры из кода вы выберете и почему?

A

using (var con = new SqlConnection("STRINGHERE"))
{
    using (var command = new SqlCommand("[dbo].[AwesomeGet]", con))
    {
        var dataTable = new DataTable();
        //fill data here
        command.CommandType = CommandType.StoredProcedure;
        command.Parameters.AddWithValue("@IDs", dataTable);
        //query and read
    }
}

Б

using (var con = new SqlConnection("STRINGHERE"))
{
    var sql = $@"declare @tmp  IDList
       insert into IDList values ({data.ToSqlString()})
       exec dbo.AwesomeGet @tmp";

    using (var command = new SqlCommand(sql, con))
    {
        var dataTable = new DataTable();
        //fill data here
        command.CommandType = CommandType.StoredProcedure;
        command.Parameters.AddWithValue("@IDs", dataTable);
        //query and read
    }
}
Задача 5

В вашем интернет-магазине можно оплатить часть цены заказа баллами. Баллы снимают цену 1:1 к рублю и могут иметь копейки. Нужно распределить эти баллы по товарам в заказе так, чтобы на каждую позицию приходилось число баллов в копейках, кратное количеству товара в позиции, и чтобы при этом баллы распределялись пропорционально стоимости позиций. Если удовлетворить этим условиям не получается, то эксепшн надо выбросить.

Например, в заказе 3 ручки общей стоимостью 1 рубль, количество баллов 1. Распределить 100 копеек на три ручки невозможно, следовательно это эксепшн. Другой пример: в заказе 1 телевизор за 10 000 рублей и 2 рулона бумаги по 1000 рублей каждая, итого 12 баллов. На телевизор придется 10 баллов, на каждый рулон по 1 баллу.

Реализуйте интерфейс IDiscounter.

public class OrderItem
{
    public int Id { get; set; }

    public int Quantity { get; set; }

    // цена за всю позицию = цена за товар * Quantity
    public decimal PriceSum { get; set; } 

    public decimal PointsDiscount { get; set; }
}

public interface IDiscounter
{
    // возвращает словарь в котором int это айди товара а decimal сколько баллов приходится на единицу товара
    Dictionary SpreadDiscount(OrderItem[] items, decimal points) 
}

Оставьте адрес почты, чтобы получить ответ.

Предоставляя адрес электронной почты, вы принимаете условия соглашения о персональных данных.

Нашли опечатку? Выделите фрагмент и нажмите Ctrl+Enter.