parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

забавный бред, вариант

Александр Петросян (PAF) 27.05.2005 13:27

посмотрел SSCLI исходники,
если во входной строке или в искомой строке не английские буквы, мы идём по медленному пути:
// \sscli\clr\src\classlibnative\nls\sortingtable.cpp
int NativeCompareInfo::IndexOfString(...
там какой-то редкостный по глубине бред с диакритическими весами и прочим на ~500 строк.

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

увы, нас посчитали недостойными быстрого поиска:
// \sscli\clr\src\classlibnative\nls\sortingtablefile.h

//This is the list of English locales which we currently understand.  
//We should only do fast comparisons in one of these locales.
#define IS_FAST_COMPARE_LOCALE(loc) (((loc)==0x0409) /*USA*/     || ((loc)==0x0809) /*UK*/ ||\
                                     ((loc)==0x0C09) /*AUS*/     || ((loc)==0x1009) /*CANADA*/ ||\
                                     ((loc)==0x2809) /*Belize*/  || ((loc)==0x2409) /*Caribean*/ ||\
                                     ((loc)==0x1809) /*Ireland*/ || ((loc)==0x2009) /*Jamaica*/ ||\
                                     ((loc)==0x1409) /*NZ*/      || ((loc)==0x3409) /*Philippines*/ ||\
                                     ((loc)==0x2C09) /*Trinidad*/|| ((loc)==0x1c09) /*South Africa*/ ||\
                                     ((loc)==0x3009) /*Zimbabwe*/)
можно попробовать так:
CultureInfo.CurrentCulture.CompareInfo.IndexOf(where, "what", CompareOptions.Ordinal);
Ordinal
Indicates that the string comparison must be done using the Unicode values of each character, which is a fast comparison but is culture-insensitive.
Parser3, понятное дело, в диакритических знаках не силён, и в нём работает всё существенно проще.
хотя и не так просто, как в Parser2.