Byłoby naprawdę miło; powiedzmy, aby zdefiniować odpowiednik ~=równoległy ==jako wersję bez uwzględniania wielkości liter.
eidylon
Jeśli programiści firmy Microsoft to zobaczą, myślę, że w następnej wersji csharp potrzebny jest operator bez rozróżniania wielkości liter. Ten ciąg.Equal () jest długi.
Jestem względnym nowicjuszem StackOverflow - czy możesz wyjaśnić, co masz na myśli, dodając link? Czy masz na myśli dokumenty MSDN?
John Feminella,
55
Jeśli chcesz porównać kulturę, użyj tej metody. Jeśli chcesz się tylko upewnić, że zarówno „FILE”, jak i „file” są akceptowane, użyj „OrdinalIgnoreCase” lub Twój kod może nie działać w miejscach takich jak tureckie lokalizacje. Więcej informacji można znaleźć na stronie moserware.com/2008/02/does-your-code-pass-turkey-test.html
Jeff Moser
10
Nie jestem pewien, o czym mówi Samuel ... ta odpowiedź jest idealna. Jego poprawne i oczywiste. Nie potrzebuje żadnych odniesień. +1
Sailing Judo
3
Ach, to taki okropny kęs! moja klawiatura się zużyje. Dawno minęły czasy, kiedy mogę używać „ if A$=B$ then goto 10”
Sanjay Manohar
9
@Sanjay Manohar W takim razie napisz niestandardowy operator - poleciłbym lepszą klawiaturę.
Rushyo
37
Najlepszym sposobem porównania 2 łańcuchów ignorujących wielkość liter jest użycie statycznej metody String.Equals , określającej porównanie ciągów liczb porządkowych ignorujących wielkość liter . Jest to również najszybszy sposób, znacznie szybszy niż konwersja ciągów znaków na małe lub duże litery i ich późniejsze porównywanie.
Przetestowałem wydajność obu podejść i porównanie ciągów znaków porządkowych ignorujących wielkość liter było ponad 9 razy szybsze ! Jest również bardziej niezawodny niż konwersja ciągów znaków na małe lub duże litery (sprawdź turecki problem i). Dlatego zawsze używaj metody String.Equals , aby porównać ciągi znaków dla równości:
Zwróć uwagę, że w drugim przykładzie użyto logiki porównywania ciągów bieżącej kultury, co powoduje, że jest ona wolniejsza niż porównanie „porządkowego ignorowania wielkości liter” w pierwszym przykładzie, więc jeśli nie potrzebujesz żadnej logiki porównywania ciągów specyficznej dla kultury i jesteś po osiągnięciu maksymalnej wydajności użyj porównania „porządkowa ignoruj wielkość liter”.
Nie sugeruj ToLowerani ToLowerInvariant: tworzą pamięć tylko w celu wykonania porównania i mogą się nie powieść, gdy nowe zestawy znaków zostaną dodane do Unicode. ToUpperzawodzi z powodu m.in. tureckiego „i”; nie ma powodu, dla którego ToLowernie zawiedzie w przyszłości z podobnych powodów.
antiduh
@antiduh, dziękuję za komentarz. Większość z nas jest świadoma tych potencjalnych problemów, wiele tutoriali w Internecie podaje tureckie „i” jako przykład. Jak widzicie w moim poście, nie polecam stosowania ToLowerani ToLowerInvariantmetod, chciałem tylko pokazać, o ile wydajniejsza jest ta String.Equalsmetoda.
Pavel Vladov
3
„Większość z nas zdaje sobie sprawę z tych potencjalnych problemów, wiele samouczków w Internecie podaje tureckie„ i ”jako przykład” - nie ma wystarczającej liczby osób, a Ty nadal wymieniasz to jako drugie zdanie w swojej odpowiedzi. Co więcej, twoja odpowiedź nie zawiera wystarczającego uzasadnienia, aby nigdy jej nie używać - po prostu wspomnij o wydajności; wydajność nie zawsze jest najwyższym priorytetem. W rezultacie obecnie naruszasz wytyczne Centrum pomocy; linki do zewnętrznych witryn są w porządku, ale nie podsumowałeś wystarczająco zawartości (problem z tureckim „i”). SO nie jest Twoją platformą reklamową.
antiduh
20
Istnieje wiele właściwości w StringComparerklasie statycznej, które zwracają elementy porównujące dla dowolnego typu rozróżniania wielkości liter:
Operator? NIE, ale myślę, że możesz zmienić swoją kulturę, aby w porównaniu ciągów nie była rozróżniana wielkość liter.
// you'll want to change this...System.Threading.Thread.CurrentThread.CurrentCulture// and you'll want to custimize thisSystem.Globalization.CultureInfo.CompareInfo
Jestem przekonany, że zmieni to sposób porównywania ciągów znaków przez operator równości.
Tak, delikatnie mówiąc, absolutnie nie jest to to, co chciałbyś zrobić, chyba że chcesz, aby wszystkie porównania ciągów były niewrażliwe na wielkość liter. Ale myślę, że zmienia to zachowanie operatora równości.
Chociaż podoba mi się czysto wyglądająca składnia użycia, jest nieco myląca ( IgnoreCasevs IgnoreCaseString) i niejednoznaczna (Java wybiera niejawne rozpakowywanie vs niejawne pakowanie, więc uważam , że nie zadziałaoby to w Javie z niejawnym rzutowaniem z powrotem na ciąg). Tworzy to narzut pamięci na 2 nowe obiekty, a wykonanie drzewa wywołań dla każdego porównania przeskakuje do kilku zagnieżdżonych wywołań metod dla wyświetlanego przypadku użycia. To powiedziawszy, w większości przypadków wydajność jest prawdopodobnie wystarczająco dobra.
Arkaine55
Chociaż jest to sprytny pomysł, nie jest tak naprawdę mądry z punktu widzenia możliwości konserwacji. Skutecznie tworzysz zastępczy typ ciągu zamiast korzystać z wbudowanego w system typu ciągu. Programista, który przychodzi później, na pierwszy rzut oka nie zrozumie, co się dzieje, a potem przeklnie cię. Używanie string.Equals () nie jest wcale takie złe i większość ludzi zrozumie, co robi.
ntcolonel
1
Jestem przyzwyczajony do pisania na końcu tych metod porównawczych: , StringComparison.
Niezmiennik może być złym pomysłem, jeśli aktualna lub pożądana kultura ma specjalne zasady dotyczące wielkich liter.
OregonGhost,
Czy to tworzy nową kopię każdego ciągu? Jeśli tak, to zły pomysł.
cjk
1
Spowoduje to również zgłoszenie wyjątku, jeśli jeden (lub oba) ciągi mają wartość null.
tvanfosson
3
Pod względem wydajności nie jest to dobre rozwiązanie, ponieważ utworzysz tutaj również 2 nowe instancje stringów.
Frederik Gheysels
0
Inne odpowiedzi są tutaj całkowicie poprawne, ale w jakiś sposób wpisanie StringComparison.OrdinalIgnoreCasei użycie zajmuje trochę czasu String.Compare.
Zakodowałem prostą metodę rozszerzenia String, w której możesz określić, czy porównanie ma rozróżniać wielkość liter, czy bez sensu z wartością logiczną - zobacz następującą odpowiedź:
~=
równoległy==
jako wersję bez uwzględniania wielkości liter.Odpowiedzi:
Spróbuj tego:
źródło
if A$=B$ then goto 10
”Najlepszym sposobem porównania 2 łańcuchów ignorujących wielkość liter jest użycie statycznej metody String.Equals , określającej porównanie ciągów liczb porządkowych ignorujących wielkość liter . Jest to również najszybszy sposób, znacznie szybszy niż konwersja ciągów znaków na małe lub duże litery i ich późniejsze porównywanie.
Przetestowałem wydajność obu podejść i porównanie ciągów znaków porządkowych ignorujących wielkość liter było ponad 9 razy szybsze ! Jest również bardziej niezawodny niż konwersja ciągów znaków na małe lub duże litery (sprawdź turecki problem i). Dlatego zawsze używaj metody String.Equals , aby porównać ciągi znaków dla równości:
Jeśli chcesz przeprowadzić porównanie ciągów specyficznych dla kultury, możesz użyć następującego kodu:
Zwróć uwagę, że w drugim przykładzie użyto logiki porównywania ciągów bieżącej kultury, co powoduje, że jest ona wolniejsza niż porównanie „porządkowego ignorowania wielkości liter” w pierwszym przykładzie, więc jeśli nie potrzebujesz żadnej logiki porównywania ciągów specyficznej dla kultury i jesteś po osiągnięciu maksymalnej wydajności użyj porównania „porządkowa ignoruj wielkość liter”.
Aby uzyskać więcej informacji, przeczytaj całą historię na moim blogu .
źródło
ToLower
aniToLowerInvariant
: tworzą pamięć tylko w celu wykonania porównania i mogą się nie powieść, gdy nowe zestawy znaków zostaną dodane do Unicode.ToUpper
zawodzi z powodu m.in. tureckiego „i”; nie ma powodu, dla któregoToLower
nie zawiedzie w przyszłości z podobnych powodów.ToLower
aniToLowerInvariant
metod, chciałem tylko pokazać, o ile wydajniejsza jest taString.Equals
metoda.Istnieje wiele właściwości w
StringComparer
klasie statycznej, które zwracają elementy porównujące dla dowolnego typu rozróżniania wielkości liter:StringComparer
NieruchomościNa przykład możesz zadzwonić
lub
Jest trochę czystszy niż przeciążenia
string.Equals
lub,string.Compare
które przyjmująStringComparison
argument.źródło
lub
źródło
źródło
lub
ale musisz mieć pewność, że StringA nie jest null. Więc prawdopodobnie lepiej użyć:
jak zasugerował John
EDYCJA: poprawiono błąd
źródło
Możesz użyć
źródło
Operator? NIE, ale myślę, że możesz zmienić swoją kulturę, aby w porównaniu ciągów nie była rozróżniana wielkość liter.
Jestem przekonany, że zmieni to sposób porównywania ciągów znaków przez operator równości.
źródło
Oto pomysł na uproszczenie składni:
Użyteczne jak:
źródło
IgnoreCase
vsIgnoreCaseString
) i niejednoznaczna (Java wybiera niejawne rozpakowywanie vs niejawne pakowanie, więc uważam , że nie zadziałaoby to w Javie z niejawnym rzutowaniem z powrotem na ciąg). Tworzy to narzut pamięci na 2 nowe obiekty, a wykonanie drzewa wywołań dla każdego porównania przeskakuje do kilku zagnieżdżonych wywołań metod dla wyświetlanego przypadku użycia. To powiedziawszy, w większości przypadków wydajność jest prawdopodobnie wystarczająco dobra.Jestem przyzwyczajony do pisania na końcu tych metod porównawczych:
, StringComparison.
Więc zrobiłem rozszerzenie.
Zwróć uwagę, że
thisString
przed wywołaniem rozszerzenia ext.źródło
źródło
Ludzie zgłaszają, że ToUpperInvariant () jest szybsze niż ToLowerInvariant ().
źródło
Inne odpowiedzi są tutaj całkowicie poprawne, ale w jakiś sposób wpisanie
StringComparison.OrdinalIgnoreCase
i użycie zajmuje trochę czasuString.Compare
.Zakodowałem prostą metodę rozszerzenia String, w której możesz określić, czy porównanie ma rozróżniać wielkość liter, czy bez sensu z wartością logiczną - zobacz następującą odpowiedź:
https://stackoverflow.com/a/49208128/2338477
źródło