четверг, 2 октября 2014 г.

Сортировка случайных строк по одной из их частей.

Недавно столкнулся с интересной задачей, общий смысл которой сводится к тому что мы получаем на вход массив строк, допустим, вида "1 тест","2 что-то еще написано", и этот список нужно вернуть отсортированным по, в данном случае, первой части строки - цифре. Хочу рассказать вам о решении, может быть, кому-то пригодится.

Подводный камень номер один - производительность. Если использовать для выделения первой части строки string.Split(), то производительность падает пропорционально длине строк, раз, и размеру текста - два.  Эту проблему можно решить, используя регулярные выражения.
Например, для строк нашего типа можно сделать вот так:

 
    string line = "1 тест";
    string firstNumber = Regex.Match(line, "^(.*?)\s.*$").Groups[1].Value;

Подробно о результатах сравнения производительности .Split() и Regex я напишу в отдельном посте, а сейчас продолжим. Итак, мы получили первый элемент строки, по которому нам нужно сортировать, теперь нужно придумать как сортировать строки.


понедельник, 29 сентября 2014 г.

Как программно сделать скриншот.

Если когда-нибудь вам понадобиться программно сделать скриншот (ну, вдруг вы захотите облегчить жизнь пользователям и себе и решите делать скриншот автоматически в случае какой-то серьезной ошибки в вашем приложении), то нет ничего проще. Всего несколько строк кода и все готово:

 
     Bitmap screen;

     //в начале, нам надо получить размеры экрана.
     Rectangle screenDimensions = System.Windows.Forms.Screen.PrimaryScreen.Bounds;
     Size s = new Size(screenDimensions.Width, screenDimensions.Height);

     //и создать соответствующее пустое изображение.
     screen = new Bitmap(s.Width, s.Height);
     Graphics memoryGraphics = Graphics.FromImage(screen);

     //вуаля! делаем скриншот.
     memoryGraphics.CopyFromScreen(0, 0, 0, 0, s);

     //и сохраняем в файл.
     screen.Save("any_filename_you_like.jpg",System.Drawing.Imaging.ImageFormat.Jpeg);


PS. Да, не забудьте подключить пространство имен System.Drawing.