What is the difference between these two classes ?
I have used System.StringComparer.OrdinalIgnoreCase() and System.StringComparison.OrdinalIgnoreCase() and both yield the same results. Do they have any difference or they both same ?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
StringComparer is a Class which implements comparison interfaces like IComparer, IEqualityComparer, IComparer<String>, so that it can be used to compare two strings.
StringComparison is simply an Enum that you can pass in to certain methods to indicate which kind of comparison you want. In that case I suspect the underlying method would use a StringComparer to do the actual comparison.
When to use each
String specific methods like String.Equals only accepts a StringComparison value, so that’s what you would use in this case.
You would use a StringComparer for methods which take a comparer as a parameter, and are called in a context where strings will be compared. For example, if you had a List<String>, and wanted to Sort that list in a case-insensitive way, you could do:
myList.Sort(StringComparer.OrdinalIgnoreCase);
Method 2
The question is: why to have in a framework both of them ?
The explanation is this one:
- StringComparison is:
Specifies the culture, case, and sort rules to be used by certain
overloads of the String.Compare and String.Equals methods
- StringComparer is:
Represents a string comparison operation that uses specific case and
culture-based or ordinal comparison rules
Noticed a difference ?
In second case, so in case of StringComparer there is a notion of string comparison operation, but not string type.
In fact, if you look at this you will read simply:
Some non-string methods that have string comparison as a central
operation use the StringComparer type.
An example, from the same link:
Array.BinarySearch(this.storedNames, name, StringComparer.Ordinal)
I use StringComparer like a comparison “base” among content of the array reference type.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0