2015-09-23 9 views
11

В Best Practices for Using Strings in the .NET Framework, StringComparison OrdinalIgnoreCase рекомендуется для путей, нечувствительных к регистру. (Давайте назовем это заявление А.)ToUpperInvariant() - MSDN ошибочно по рекомендации?

Я могу с этим согласиться, потому что я могу создать два файла в том же каталоге:

é.txt 
é.txt 

Их имена не совпадают, второй один состоит из e и модификатор, поэтому на самом деле он имеет две буквы. (Вы можете попробовать себя с помощью copy-paste.)

Если было проведено сравнение инвариантных культур (а не сравнение по порядку), NTFS не разрешала бы эти файлы, потому что в той же статье они объясняют, что в инвариантной культуре a + ̊ = å

Но в статье на String.ToUpperInvariant() есть другая рекомендация: (Заявление Б.)

Если вам нужен нижнем или верхний регистр версия идентификатора операционной системы, такие как имя файла, именованный канал, или раздел реестра, используйте методы ToLowerInvariant или ToUpperInvariant.

Мне нужно создать коллекцию путей к файлу (на самом деле HashSet), чтобы обнаружить дубликаты. Поэтому, если я буду подчиняться заявлению B при создании карты, я могу закончить с ложными срабатываниями, потому что вышеупомянутые имена файлов é.txt и é.txt будут рассматриваться как один. Правильно ли я понимаю, что утверждение B, найденное в MSDN, вводит в заблуждение? Или я чего-то не хватает?

Я собираюсь создать библиотеку, желательно без известных ошибок с самого начала, поэтому я просто не хочу пренебрегать этим.

Update:

Заявление B, кажется, есть еще один вопрос: ToLowerInvariant() не может быть на самом деле используется. Причина (цитирую Best Practices статью): DO: Use ToUpperInvariant rather than ToLowerInvariant when normalizing strings for comparison. Реальная причина: There is a small range of characters that do not roundtrip, and going to lowercase will make these characters unavailable. (source)

+3

Я не совсем уверен, что «строчная или прописная версия идентификатора операционной системы» означает то же самое, что «однозначное сопоставление идентификатора операционной системы с строчной или прописной версией». Это также может означать «сопоставление идентификатора операционной системы с неповторимой строчной или прописной версией, которая будет работать одинаково независимо от локали системы». –

+0

OT, но кто знает, что делает ваша библиотека: NTFS также разрешает ':', '*' или '?' Имена файлов. Это просто Windows, которая не поддерживает его. Создание таких файлов на NTFS под Linux довольно просто. –

+0

@ O.R.Mapper - хороший способ чтения этого утверждения ... В этом контексте он выглядит логичным. С другой стороны, они могут либо не упоминать имена файлов, либо добавить короткую заметку о (не) уникальности. – miroxlav

ответ

5

Ни в верхний регистр, ни lowercasing правильно, когда вы хотите сравнить строки равенства регистронезависимо. В обоих вариантах есть символы, которые испортили это.

Правильный способ сравнения строк без учета регистра - использовать один из нечувствительных параметров StringComparison (вы знаете это).

Правильный способ использования структуры данных без учета регистра - использовать один из StringComparer.*IgnoreCase. Например:

new HashSet<string>(StringComparer.InvariantCultureIgnoreCase) 

ли не заглавных строк перед добавлением их в структуру данных. Я бы не смог это сделать в любом обзоре кода.

Если вам нужно нижнем или верхнем регистре версии идентификатора операционной системы

Вам не нужно, например, как вещь. Это заявление не относится к вашему делу.

+0

Итак, в случае имен файлов NTFS это означает «новый HashSet (StringComparer.OrdinalIgnoreCase)» (или просто «OrdinalCase», в зависимости от того, как чувствительность к регистру NTFS переключается в конкретном случае). – miroxlav

+0

Я не знаю, какое сравнение использует NTFS. Он может быть настроен. На каждом томе NTFS есть скрытый файл, в котором хранится таблица сопоставления событий Unicode. Думаю, это может быть произвольно. Не уверен, что это на практике. – usr

+0

Да, я знаю, что ... Это означает, что нам может понадобиться нечто вроде сравнения «NtfsIgnoreCase», работающее на основе содержимого скрытого файла '$ UpCase' :) – miroxlav

 Смежные вопросы

  • Нет связанных вопросов^_^