string.ToLower () i string.ToLowerInvariant ()


Odpowiedzi:


148

W zależności od bieżącej kultury ToLower może wygenerować małą literę specyficzną dla kultury, której nie oczekujesz. Takich jak tworzenie ınfobez kropki na i zamiast, infoa tym samym zakłócanie porównań ciągów. Z tego powodu ToLowerInvariant powinien być używany w przypadku wszelkich danych niespecyficznych dla języka. Gdy możesz mieć dane wejściowe użytkownika, które mogą być w ich rodzimym języku / zestawie znaków, na ogół byłby to jedyny przypadek, w którym używasz ToLower.

Zobacz to pytanie, aby zapoznać się z przykładem tego problemu: C # - ToLower () czasami usuwa kropkę z litery „I”


45

Myślę, że może to być przydatne:

http://msdn.microsoft.com/en-us/library/system.string.tolowerinvariant.aspx

aktualizacja

Jeśli aplikacja zależy od przypadku zmiany ciągu w przewidywalny sposób, na który nie ma wpływu bieżąca kultura, użyj metody ToLowerInvariant. Metoda ToLowerInvariant jest równoważna z ToLower (CultureInfo.InvariantCulture). Metoda jest zalecana, gdy kolekcja ciągów musi pojawiać się w przewidywalnej kolejności w kontrolce interfejsu użytkownika.

również

... ToLower jest bardzo podobne w większości miejsc do ToLowerInvariant. Z dokumentów wynika, że ​​metody te zmienią zachowanie tylko w przypadku kultur tureckich. Ponadto w systemach Windows system plików nie rozróżnia wielkości liter, co dodatkowo ogranicza jego użycie ...

http://www.dotnetperls.com/tolowerinvariant-toupperinvariant

hth


@danyolgiax Czy możesz to rozwinąć? nie można wywnioskować jego użyteczności z linku msdn. Dzięki
Prerak K

2
yes ToLowerInvariant nie działa w języku tureckim zgodnie z oczekiwaniami. İ staje się ı
MonsterMMORPG

28

String.ToLower()używa domyślnej kultury, podczas gdy String.ToLowerInvariant()używa niezmiennej kultury. Więc zasadniczo pytasz o różnice między niezmienną kulturą a porządkową porównaniem ciągów .


Nie, nie jest. „Porządkowa” to trzecia opcja - nieco inny sposób na „ignorowanie” aktualnej kultury. To rozróżnienie nie ma znaczenia przy omawianiu ToLowerwariantów; Porządkowy kontra niezmiennik po prostu zmienia „porządek sortowania” dwóch ciągów, nie zmienia porównania równości.
ToolmakerSteve

27

TL; DR:

Podczas pracy z „treścią” (np. Artykuły, posty, komentarze, nazwiska, miejsca itp.) Używaj ToLower(). Podczas pracy z "literałami" (np. Argumentami wiersza poleceń, niestandardowymi gramatykami, napisami, które powinny być wyliczeniami, itp.) Użyj ToLowerInvariant().

Przykłady:

= Nieprawidłowe użycieToLowerInvariant =

W języku tureckim DIŞoznacza „na zewnątrz” i diş„ząb”. Właściwa dolna obudowa DIŞjest dış. Tak więc, jeśli użyjesz ToLowerInvariantnieprawidłowo, możesz mieć literówki w Turcji.

= Nieprawidłowe użycieToLower =

Teraz udawaj, że piszesz parser SQL. Gdzieś będziesz miał kod, który wygląda tak:

if(operator.ToLower() == "like")
{
  // Handle an SQL LIKE operator
}

Gramatyka SQL nie zmienia się po zmianie kultur. Francuz nie pisze SÉLECTIONNEZ x DE bookszamiast SELECT X FROM books. Jednak aby powyższy kod działał, osoba z Turcji musiałaby pisać SELECT x FROM books WHERE Author LİKE '%Adams%'(zwróć uwagę na kropkę nad wielką literą i, prawie niemożliwe do zobaczenia). Byłoby to dość frustrujące dla tureckiego użytkownika.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.