Jak mogę sprawić, aby wiersz poniżej nie rozróżniał wielkości liter?
drUser["Enrolled"] =
(enrolledUsers.FindIndex(x => x.Username == (string)drUser["Username"]) != -1);
Dostałem dzisiaj kilka porad, które sugerują, żebym użył:
x.Username.Equals((string)drUser["Username"], StringComparison.OrdinalIgnoreCase)));
Problem w tym, że nie mogę tego uruchomić. Wypróbowałem poniższy wiersz, który się kompiluje, ale zwraca nieprawidłowe wyniki, zwraca zarejestrowanych użytkowników jako niezarejestrowanych i niezarejestrowanych użytkowników jako zarejestrowanych.
drUser["Enrolled"] =
(enrolledUsers.FindIndex(x => x.Username.Equals((string)drUser["Username"],
StringComparison.OrdinalIgnoreCase)));
Czy ktoś może wskazać problem?
drUser["Enrolled"]
być typ danych ? Wygląda jak wartość logiczna, aleFindIndex()
zwraca indeks. Jeśli indeks tego użytkownika wynosi 0, wówczas zwróci 0, co może być fałszem. Kiedy w rzeczywistości jest prawdą. WExists()
tym przypadku metoda może być lepsza.Odpowiedzi:
To nie jest najlepsza praktyka w .NET Framework (4 i +) do sprawdzania równości
Zamiast tego użyj następujących
MSDN zaleca:
źródło
string.Compare
, nieString.Compare
.string
jest lepszą praktyką niżString
ponieważ jest słowem kluczowym dla języka. Po pierwsze,String
może być czymś innym niżSystem.String
, podczas gdystring
nie może być. Ponadtostring
jest mniej więcej gwarantowane, że istnieje w języku C #, podczas gdyString
technicznie jest częścią .NET, a nie C #.Powinieneś użyć
String.Compare
funkcji statycznej jak poniżejźródło
String.Equals
zamiastString.Compare
. Nie ma potrzeby obliczania, który z nich jest większy, tylko że nie są one równe.IEquatable
iIComparable
NIE rób tego samego, i możesz mieć klasy, które implementują jedną, ale w których nie ma sensu implementować drugiej. Na przykład można zamówić próbki próbek według czasu, przy czym żadne z nich nie będzie równe (IComparable). I możesz wskazać, czy rzeczy są równe (IEquatable), ale nie ma sensu ich porządkować (powiedzmy, numery seryjne komputera).Użyj tego do porównania:
źródło
Inne odpowiedzi są tutaj całkowicie poprawne, ale jakoś zajmuje trochę czasu, aby pisać
StringComparison.OrdinalIgnoreCase
i używaćString.Compare
.Kodowałem prostą metodę rozszerzenia Ciągu, w której można określić, czy w porównaniu rozróżniana jest wielkość liter, czy też nie ma sensu wielkość logiczna, dołączając tutaj cały fragment kodu:
Po tym całe porównanie skraca się w przybliżeniu o 10 znaków - porównaj:
Przed użyciem rozszerzenia String:
Po użyciu rozszerzenia String:
źródło
Można (choć kontrowersyjnie) rozszerzyć,
System.String
aby zapewnić metodę rozszerzenia porównania bez rozróżniania wielkości liter:i użyj jako takiego:
C # pozwala tworzyć metody rozszerzeń, które mogą służyć jako narzędzie do tworzenia składni w twoim projekcie, co byłoby całkiem przydatne.
To nie jest odpowiedź i wiem, że to pytanie jest stare i rozwiązane, chciałem tylko dodać te bity.
źródło
Myślę, że znajdziesz więcej informacji w tym linku:
http://codeidol.com/community/dotnet/controlling-case-sensitivity-when-comparing-two-st/8873/
Użyj metody statycznej Porównaj w klasie String, aby porównać dwa ciągi. To, czy porównanie nie uwzględnia wielkości liter, zależy od trzeciego parametru jednego z jego przeciążeń. Na przykład:
Wartość caseSensitiveResult wynosi -1 (wskazując, że lowerCase jest „mniejsza niż” upperCase), a caseInsensitiveResult ma wartość zero (wskazując, że lowerCase „równa się” upperCase).
źródło
A może
StringComparison.CurrentCultureIgnoreCase
zamiast tego użyć ?źródło
Chciałbym napisać metodę rozszerzenia dla EqualsIgnoreCase
źródło
zawsze możesz użyć funkcji: .ToLower (); .ToUpper ();
przekonwertować ciągi, a następnie porównać je ...
Powodzenia
źródło