Wednesday, December 29, 2010

Подсчитать число уникальных слов

На 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.

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.

Wednesday, December 22, 2010

Отображение дня недели в Excel

  1. Выделите ячейки, содержащие даты, которые должны отображаться в виде дней недели.
  2. На вкладке Главная в группе Число щелкните стрелку, нажмите кнопку Другие числовые форматы, а затем откройте вкладку Число.
  3. В поле Числовые форматы выделите пункт (все форматы) и в поле Тип введите значение дддд, чтобы отображались полные названия дней недели (понедельник, вторник и т. д.), либо ддд, чтобы отображались сокращенные названия дней недели (Пн, Вт, Ср и т. д.).
http://office.microsoft.com/ru-ru/excel-help/HP010070474.aspx

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;
            }
        }

    }Теперь это исключение можно поймать и сообщить пользователю что-то осмысленное.

Saturday, December 11, 2010

Антипаттерн "наивный код"

Не знаю, наверное, у этого антипаттерна есть красивое название. Смысл его в том, что программист пишет код, не задумываясь или просто надеясь, что программа будет работать в тех же условиях, что и разрабатывалась.
Вот очередной пример:
   file.Open("C:\\AutoSystem\\nastroika.dat",CFile::modeRead);
Почему собственно файл настроек должен лежать именно там? Да и вообще кто сказал, что диск C будет существовать на том компьютере, где будет устанавливаться система?

Тоже самое касается веб-варианта, когда URL вычисляется сложением
  "http://" + serverName + "/" + pageName
Запустить такой сайт через https не получится - протокол зашит в код намертво.

Бессмысленные комментарии

Даже самые несогласные соглашаются, что комментарии в коде должны быть (я уже писал зачем). Но – какой смысл писать их не понимая смысла этого действия?
Как я загнул… J Но если в тексте эта заумная фраза выглядит странно, то почему некоторые программисты считают, что аналогичные комментарии выглядят нормально:
  CStdioFile file;// объявление класса file
Правда ведь все понятно стало?
Или так:
  i++; // увеличиваем i на 1
  if (count > 0) // если больше нуля
И не лень кому-то тратить свое время на набор этих буквичек…