Разница между InvariantCulture и порядком сравнения строк

Два отражённых решения, о которых я знаю из моих дней C ++:

1) Используйте RTTI, который предоставит вам бутстрап, чтобы вы могли создать свое отражение-поведение, если сможете получить все ваши классы, чтобы получить базовый класс «объект». Этот класс может предоставить некоторые методы, такие как GetMethod, GetBaseClass и т. Д. Что касается того, как эти методы работают, вам нужно вручную добавить некоторые макросы для украшения ваших типов, которые за кулисами создают метаданные в типе, чтобы предоставлять ответы на GetMethods и т. Д.

2) Другим вариантом, если у вас есть доступ к объектам компилятора, является использование DIA SDK . Если я правильно помню, это позволит вам открыть pdbs, который должен содержать метаданные для ваших типов C ++. Этого может быть достаточно, чтобы сделать то, что вам нужно. На этой странице показано, как вы можете получить все базовые типы класса, например.

Оба эти решения немного уродливы! Нет ничего похожего на немного C ++, чтобы вы оценили роскошь C #.

Удачи.

495
задан Adrian Godong 8 September 2014 в 20:06
поделиться

4 ответа

Использование InvariantCulture

"стандартный" набор символьных упорядочиваний (a, b, c... и т.д.). Это в отличие от некоторых определенных локалей, которые могут отсортировать символы в различных заказах ('a-acute', может быть прежде или после, в зависимости от локали, и так далее).

Порядковый

, С другой стороны, смотрит просто на значения необработанного байта (байтов), которые представляют символ.

<час>

существует большой образец в http://msdn.microsoft.com/en-us/library/e6883c06.aspx , который показывает результаты различных значений StringComparison. Полностью в конце, это показывает (извлеченный):

StringComparison.InvariantCulture:
LATIN SMALL LETTER I (U+0069) is less than LATIN SMALL LETTER DOTLESS I (U+0131)
LATIN SMALL LETTER I (U+0069) is less than LATIN CAPITAL LETTER I (U+0049)
LATIN SMALL LETTER DOTLESS I (U+0131) is greater than LATIN CAPITAL LETTER I (U+0049)

StringComparison.Ordinal:
LATIN SMALL LETTER I (U+0069) is less than LATIN SMALL LETTER DOTLESS I (U+0131)
LATIN SMALL LETTER I (U+0069) is greater than LATIN CAPITAL LETTER I (U+0049)
LATIN SMALL LETTER DOTLESS I (U+0131) is greater than LATIN CAPITAL LETTER I (U+0049)

Вы видите это, где InvariantCulture уступает (U+0069, U+0049, U+00131), Порядковые урожаи (U+0049, U+0069, U+00131).

281
ответ дан Liam 9 September 2014 в 07:06
поделиться

Другое удобное различие (на английском языке, где диакритические знаки являются редкими) - то, что сравнение InvariantCulture сравнивает все строки первым нечувствительным к регистру, и затем при необходимости (и требуемый) различает случаем после первого сравнения только на отличных буквах. (Можно также сделать нечувствительное к регистру сравнение, конечно, который не будет различать случаем.) Исправленный: буквы С диакритическим знаком считаются другой разновидностью тех же букв, и строка сравнена, сначала игнорируя диакритические знаки и затем составляя их, если общие буквы все соответствие (как с отличающимся случаем кроме не в конечном счете проигнорированный в нечувствительном к регистру выдерживают сравнение). Это группирует акцентируемые версии иначе того же слова друг около друга вместо абсолютно отдельного в первом различии в диакритическом знаке. Это - порядок сортировки, который Вы обычно находили бы в словаре с капитализированными словами, появляющимися прямо рядом с их строчными эквивалентами и акцентируемыми буквами, являющимися около соответствующей безударной буквы.

порядковое сравнение выдерживает сравнение строго на значениях цифрового символа, останавливающихся в первом различии. Это сортирует использованные для своей выгоды буквы, абсолютно отдельные от строчных букв (и акцентируемые буквы, по-видимому, отделяются от тех), таким образом, использованные для своей выгоды слова нигде не отсортировали бы около их строчных эквивалентов.

InvariantCulture также полагает, что прописные буквы больше, чем нижний регистр, тогда как Ordinal полагает, что прописные буквы меньше, чем нижний регистр (пережиток ASCII с былых времен, прежде чем компьютеры имели строчные буквы, прописные буквы были выделены сначала и таким образом имели нижние значения, чем строчные буквы, добавленные позже).

, Например, Ordinal: "0" < "9" < "A" < "Ab" < "Z" < "a" < "aB" < "ab" < "z" < "Á" < "Áb" < "á" < "áb"

И InvariantCulture: "0" < "9" < "a" < "A" < "á" < "Á" < "ab" < "aB" < "Ab" < "áb" < "Áb" < "z" < "Z"

56
ответ дан Jogge 9 September 2014 в 07:06
поделиться

Всегда пытайтесь использовать InvariantCulture в тех строковых методах, которые принимают его как перегрузку. При помощи InvariantCulture Вы находитесь на безопасной стороне. Многие программисты.NET не могут использовать эту функциональность, но если Ваше программное обеспечение будет использоваться различными культурами, InvariantCulture является чрезвычайно удобной функцией.

-7
ответ дан George 9 September 2014 в 07:06
поделиться

Инвариант - это лингвистически подходящий тип сравнения.
Порядковый номер - это двоичный тип сравнения. (быстрее)
См. http://www.siao2.com/2004/12/29/344136.aspx

26
ответ дан 22 November 2019 в 22:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: