Чаще всего я вижу что проверку что число четное делают так:
if (n % 2 == 0)
Тут проблем нет. А вот с нечетным часто получается засада. Проверка
if (n % 2 == 1)
не работает для отрицательных числел, т.к. результатом n%2 для отрицательных нечетных чисел будет -1, а не 1. Но об этом постоянно забывают.
Правильно писать (n%2 != 0).
А вообще проще и надежнее проверять последний бит (n & 1 == 1). Да и выполняется эта операция быстрее. Но тогда нужно рассказывать студентам про биты... :)
Showing posts with label Код. Show all posts
Showing posts with label Код. Show all posts
Saturday, January 7, 2012
Friday, September 2, 2011
Быстрое сохранение в XML класса Font, Color, enum...
Вот лень мне было по кусочкам Font сохранять в XML. Нашел вот такой способ:
public static XmlElement AddElementByConverter<T>(XmlElement parentNode, string nodeName, T attrValue)
{
TypeConverter converter = TypeDescriptor.GetConverter(typeof(T));
string value = converter.ConvertToString(attrValue));
.... ну и тут дальше как обычно
}
И загружать просто:
public static T ReadByConverter<T>(XmlNode element, string path, T defaultValue)
{
T nodeValue = defaultValue;
XmlNode node = element.SelectSingleNode(path);
.........
TypeConverter converter = TypeDescriptor.GetConverter(typeof(T));
nodeValue = (T) converter.ConvertFromString(valueString);
if (nodeValue == null)
nodeValue = defaultValue;
.........
return nodeValue;
}
Такая конструкция замечательно глотает и Font и Color и любой enum.
Типа кодюлька номер раз :)
public static XmlElement AddElementByConverter<T>(XmlElement parentNode, string nodeName, T attrValue)
{
TypeConverter converter = TypeDescriptor.GetConverter(typeof(T));
string value = converter.ConvertToString(attrValue));
.... ну и тут дальше как обычно
}
И загружать просто:
public static T ReadByConverter<T>(XmlNode element, string path, T defaultValue)
{
T nodeValue = defaultValue;
XmlNode node = element.SelectSingleNode(path);
.........
TypeConverter converter = TypeDescriptor.GetConverter(typeof(T));
nodeValue = (T) converter.ConvertFromString(valueString);
if (nodeValue == null)
nodeValue = defaultValue;
.........
return nodeValue;
}
Такая конструкция замечательно глотает и Font и Color и любой enum.
Типа кодюлька номер раз :)
Thursday, September 1, 2011
Интересная штука с загрузкой изображений
Пока даже не очень понял в чем тут проблема, но нашел как решить.
Имею Image, который сохраняю в файл и загружаю из файла.
Сохраняю:
using (MemoryStream ms = new MemoryStream())
{
this.bitmap.Save(ms, ImageFormat.Bmp);
byte[] bitmapData = ms.ToArray();
string imgBase64 = Convert.ToBase64String(bitmapData);
xmlImage.InnerText = imgBase64;
}
Загружаю:
string imgBase64 = xmlImage.InnerText;
if (!string.IsNullOrEmpty(imgBase64))
byte[] bitmapData = Convert.FromBase64String(imgBase64);
using (MemoryStream ms = new MemoryStream(bitmapData))
this.bitmap = Image.FromStream(ms) as Bitmap;
Все работает без проблем - bitmap отображается как нужно, размеры сохранены
и вообще все отлично.
Но если попытаться сохранить этот загруженный image еще раз,
то получаю ошибку:
A generic error occurred in GDI+.
Что сие значит не понятно.
Решил проблему просто, но не понятно - либо не закрывать поток,
либо создавать новый image, соответственно с новым потоком.
Т.е. либо так:
MemoryStream ms = new MemoryStream(bitmapData);
this.bitmap = Image.FromStream(ms) as Bitmap;
Либо так:
this.bitmap = new Bitmap(Image.FromStream(ms) as Bitmap);
Первый вариант мне не нравится, прямо душу режет.
Второй еще пережить можно, хотя не понятно почему и в чем проблема.
UPD: Т.е. получается что при выполнении FromStream используется тот же буфер, что
я создавал в потоке.
UPD: Интересно этот редактор параграфы переставляет. Вроде сохраняешь
нормально, а получается такая каша... Хоть бы пофиксили. Задолбало.
Имею Image, который сохраняю в файл и загружаю из файла.
Сохраняю:
using (MemoryStream ms = new MemoryStream())
{
this.bitmap.Save(ms, ImageFormat.Bmp);
byte[] bitmapData = ms.ToArray();
string imgBase64 = Convert.ToBase64String(bitmapData);
xmlImage.InnerText = imgBase64;
}
Загружаю:
string imgBase64 = xmlImage.InnerText;
if (!string.IsNullOrEmpty(imgBase64))
byte[] bitmapData = Convert.FromBase64String(imgBase64);
using (MemoryStream ms = new MemoryStream(bitmapData))
this.bitmap = Image.FromStream(ms) as Bitmap;
Все работает без проблем - bitmap отображается как нужно, размеры сохранены
и вообще все отлично.
Но если попытаться сохранить этот загруженный image еще раз,
то получаю ошибку:
A generic error occurred in GDI+.
Что сие значит не понятно.
Решил проблему просто, но не понятно - либо не закрывать поток,
либо создавать новый image, соответственно с новым потоком.
Т.е. либо так:
MemoryStream ms = new MemoryStream(bitmapData);
this.bitmap = Image.FromStream(ms) as Bitmap;
Либо так:
this.bitmap = new Bitmap(Image.FromStream(ms) as Bitmap);
Первый вариант мне не нравится, прямо душу режет.
Второй еще пережить можно, хотя не понятно почему и в чем проблема.
UPD: Т.е. получается что при выполнении FromStream используется тот же буфер, что
я создавал в потоке.
UPD: Интересно этот редактор параграфы переставляет. Вроде сохраняешь
нормально, а получается такая каша... Хоть бы пофиксили. Задолбало.
Subscribe to:
Posts (Atom)