На RSDN обсуждался интересный вопрос - как подсчитать число уникальных слов в тексте. Если слова раскиданы в Excel, то сделать это очень просто.
Например, слова записаны в столбец A. Рядом в столбец B пишем формулу:
=IF(COUNTIF($A$1:A1;A1)=1;1;0)
=IF(COUNTIF($A$1:A2;A2)=1;1;0)
И так для каждой строки в A. Разумеется саму формулу руками не вбиваем - ее можно скопировать в буфер и, выделив весь столбец B, вставить. Или вбить ее в первую строку B и потом растянуть.
Теперь в C1 можно написать =SUM(B:B). Получим сколько уникальных слов в столбце A.
Wednesday, December 29, 2010
Tuesday, December 28, 2010
Опасный IndexOf
Нашел интересный пост Wei Zhao про поиск и сравнение строк. Задача формулируется так: заменить все двойные пробелы на одиночные. Код очень простой:
Теперь код зависать не будет ни при каких обстоятельствах.
while (original.IndexOf(" ") != -1)
{
original = original.Replace(" ", " ");
}
Для “обычных” строк все работает отлично.
А вот если строка original содержит символы пробелов в Unicode, то этот код зависает. Вот такая например:
string original = new string(new char[]{ '\u0020', '\ufffd', '\u0020' });
Проблема заключается в том, что метод IndexOf ищет в текущей культуре, а символом \ufffd обозначаются ошибочные Unicode-символы. Другими словами, IndexOf будет возвращать всегда ноль:
char[] test = { '\u0020', '\ufffd', '\u0020' };
string testStr = new string(test);
int i = testStr.IndexOf(" "); // вернет 0, а не -1
Более подробно можно прочитать по ссылке выше в блоге автора.
А правильный вариант кода такой:
while (original.IndexOf(" ", StringComparison.Ordinal) != -1)
{
original = original.Replace(" ", " ");
}
Friday, December 24, 2010
Обработка необработанных исключений в WinForms
Обработчик добавляется следующим образом:
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
Но этого мало. Нужно еще "включить" работу этого обработчика:
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
Причем, создать обработчик можно в любом месте кода, например, в главной форме. А вот включить его можно только до добавления главной формы, т.е. в методе Main.
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
Но этого мало. Нужно еще "включить" работу этого обработчика:
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
Причем, создать обработчик можно в любом месте кода, например, в главной форме. А вот включить его можно только до добавления главной формы, т.е. в методе Main.
Wednesday, December 22, 2010
Отображение дня недели в Excel
- Выделите ячейки, содержащие даты, которые должны отображаться в виде дней недели.
- На вкладке Главная в группе Число щелкните стрелку, нажмите кнопку Другие числовые форматы, а затем откройте вкладку Число.
- В поле Числовые форматы выделите пункт (все форматы) и в поле Тип введите значение дддд, чтобы отображались полные названия дней недели (понедельник, вторник и т. д.), либо ддд, чтобы отображались сокращенные названия дней недели (Пн, Вт, Ср и т. д.).
Sunday, December 12, 2010
KeyNotFoundException
В стандартной реализации исключение KeyNotFoundException сообщает что ключ не найден, но почему-то не сообщает какой именно. Исправить ситуацию можно так:
public class MyDictionary : Dictionary<string, object>
{
public new object this[string key]
{
get
{
object value;
if (!base.TryGetValue(key, out value))
throw new KeyNotFoundException(string.Format("Значение [{0}] не найдено", key));
else
return value;
}
set
{
base[key] = value;
}
}
}Теперь это исключение можно поймать и сообщить пользователю что-то осмысленное.
public class MyDictionary : Dictionary<string, object>
{
public new object this[string key]
{
get
{
object value;
if (!base.TryGetValue(key, out value))
throw new KeyNotFoundException(string.Format("Значение [{0}] не найдено", key));
else
return value;
}
set
{
base[key] = value;
}
}
}Теперь это исключение можно поймать и сообщить пользователю что-то осмысленное.
Saturday, December 11, 2010
Антипаттерн "наивный код"
Не знаю, наверное, у этого антипаттерна есть красивое название. Смысл его в том, что программист пишет код, не задумываясь или просто надеясь, что программа будет работать в тех же условиях, что и разрабатывалась.
Вот очередной пример:
file.Open("C:\\AutoSystem\\nastroika.dat",CFile::modeRead);
Почему собственно файл настроек должен лежать именно там? Да и вообще кто сказал, что диск C будет существовать на том компьютере, где будет устанавливаться система?
Тоже самое касается веб-варианта, когда URL вычисляется сложением
"http://" + serverName + "/" + pageName
Запустить такой сайт через https не получится - протокол зашит в код намертво.
Вот очередной пример:
file.Open("C:\\AutoSystem\\nastroika.dat",CFile::modeRead);
Почему собственно файл настроек должен лежать именно там? Да и вообще кто сказал, что диск C будет существовать на том компьютере, где будет устанавливаться система?
Тоже самое касается веб-варианта, когда URL вычисляется сложением
"http://" + serverName + "/" + pageName
Запустить такой сайт через https не получится - протокол зашит в код намертво.
Бессмысленные комментарии
Даже самые несогласные соглашаются, что комментарии в коде должны быть (я уже писал зачем). Но – какой смысл писать их не понимая смысла этого действия?
Как я загнул… J Но если в тексте эта заумная фраза выглядит странно, то почему некоторые программисты считают, что аналогичные комментарии выглядят нормально:
CStdioFile file;// объявление класса file
Правда ведь все понятно стало?
Или так:
i++; // увеличиваем i на 1
if (count > 0) // если больше нуля
И не лень кому-то тратить свое время на набор этих буквичек…
Subscribe to:
Posts (Atom)