2010-06-07 2 views
1

Я пишу приложение C#, которое обрабатывает некоторый текст и предоставляет основные функции запроса. Чтобы обеспечить наилучшую поддержку других языков, я разрешаю пользователям приложения указывать System.Globalization.CultureInfo (через код стиля «en-GB»), а также полный набор параметров сортировки с использованием системы .Globalization.CompareOptions перечисляет флажок.Чувствительность к культуре GetHashCode

Для регулярного сравнения строк я затем, используя комбинацию:

а) перегрузок String.Compare, который принимает культуру и варианты
б) Для некоторых объемных процессов я кэширование данных байт (KeyData) из CompareInfo.GetSortKey (перегрузка, которая принимает параметры) и использование побайтового сравнения KeyData.

Это казалось прекрасным (хотя, пожалуйста, прокомментируйте, если вы считаете, что эти два метода не должны смешиваться), но тогда у меня были причины использовать класс HashSet <>, который имеет только перегрузку для IEqualityComparer <>.

MS документации, кажется, предполагает, что я должен использовать StringComparer (который реализует как IEqualityComparer <> и IComparer <>), но это только кажется, поддерживает опцию «IgnoreCase» от CompareOptions и не «IgnoreKanaType», «IgnoreSymbols», «IgnoreWidth» и т. Д.

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

Только мысль на данный момент заключается в создании моего собственного IEqualityComparer <>, который генерирует хэш-код из SortKey.KeyData и сравнивает эффективность использования перегрузки String.Compare.

Любые предложения?

ответ

0

Вам обязательно понадобится реализовать свой собственный IEqualityComparer <>, но я не считаю, что хэш-код обязательно должен играть в него. Просто используйте string.Compare перегрузку, как вы сказали.

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