2012-01-18 12 views
21

Jaka jest różnica między tymi dwoma klasami?Różnica między klasami System.StringComparer i System.StringComparison?

Użyłem System.StringComparer.OrdinalIgnoreCase() i System.StringComparison.OrdinalIgnoreCase() i oba dają takie same wyniki. Czy mają jakąś różnicę, czy oba są takie same?

+1

Czy możesz opublikować swoją sprawę i oczekiwane wyniki dla każdego z nich. Zastanawiam się, czy porównasz == kontra równości w kategoriach odniesień do wartości – MethodMan

+0

'System.StringComparison.OrdinalIgnoreCase' jest wartością wyliczeniową, a nie metodą. Więc 'System.StringComparison.OrdinalIgnoreCase()' nie skompilowałoby się. Nie jestem pewien, co właściwie miałeś na myśli. – AakashM

Odpowiedz

14

StringComparer jest Class który implementuje interfejsy porównanie jak IComparer, IEqualityComparer, IComparer<String>, tak że może on być używany do porównania dwóch ciągów.

StringComparison to po prostu Enum, które można przekazać do niektórych metod, aby wskazać, jakiego rodzaju porównanie chcesz. W takim przypadku podejrzewam, że metoda bazowa użyłaby StringComparer do rzeczywistego porównania.

Kiedy używać każdego

String specyficzne metody jak String.Equals przyjmuje tylko wartości StringComparison, więc to, co można zastosować w tym przypadku.

Można użyć metody StringComparer dla metod, które pobierają parametr porównujący jako parametr i są wywoływane w kontekście, w którym ciągi będą porównywane. Na przykład, jeśli miał List<String> i chciał Sort tej listy w przypadku niewrażliwe sposób, można zrobić:

myList.Sort(StringComparer.OrdinalIgnoreCase); 
3

Pytanie brzmi: dlaczego mieć w ramach obu z nich?

wyjaśnienie jest to jedno:

  • StringComparison jest:

Określa kultura, sprawy, i uporządkować przepisy stosowane przez niektórych przeciążeń w String.Compare i Metody String.Equals

  • StringComparer jest:

Reprezentuje operację porównania ciąg, który używa konkretnej sprawy i kultury opartej lub porządkowej porównanie zasad

zauważył różnicę?

W drugim przypadku, więc w przypadku StringComparer istnieje pojęcie typu string comparison operation, ale nie typu string.

W rzeczywistości, jeśli spojrzeć na this można przeczytać po prostu:

Niektóre metody non-strunowe, które mają porównanie ciąg jako centralnego operacji użyć typu StringComparer.

Przykładem z tego samego linku:

Array.BinarySearch(this.storedNames, name, StringComparer.Ordinal) 

używam StringComparer jak porównanie „bazy” między treścią typu array odniesienia.

+0

Twój link nie jest angielski – Mubarek

+0

Link został zaktualizowany – StingyJack

+1

Doskonała odpowiedź. Aby było jeszcze bardziej zrozumiałe: Prawdopodobnie nigdy nie powinieneś projektować metody lub klasy, w której bierzesz StringComparison jako dane wejściowe - powinieneś wziąć jako StringComparer zamiast tego, ponieważ to pozwoliłoby klientom twojego kodu na przekazanie ich własnego niestandardowego porównywalnika, jeśli to konieczne. Porównywacz jest rozszerzalny, a porównanie nie. –

Powiązane problemy