[RESOLVED] C#'s string.Compare vs VB.NET's Operators.CompareString
Code:
using Microsoft.VisualBasic.CompilerServices;
Code:
int a = string.Compare("Davis", "DAVIS", false); //-1
int b = Operators.CompareString("Davis", "DAVIS", false); //1
int c= string.Compare("Peter", "Davis", false); //1 I expect 1. OK.
int d= Operators.CompareString("Peter", "Davis", false); //1
int f= Operators.CompareString("Peter", "davis", false); //-1
I expect a =1 because "a" is greater than "A". But c returns 1 is what I expect. Operators.CompareString always returns what I expect, e.g.b and d return 1, f returns -1.
Please explain what is C#'s string.Compare difference with Operators.CompareString.
Re: C#'s string.Compare vs VB.NET's Operators.CompareString
First, to be clear, it isn't "C#'s string.Compare". That is "Microsoft's .NET BCL method String.Compare()". All .NET languages have access to it, it's defined probably in the mscorlib.dll assembly.
What's happening here is several problems. First, you're misinterpreting how sorting works, or unaware there are two ways to sort letters in English.
Quote:
I expect a =1 because "a" is greater than "A".
That is only true if you do an ORDINAL comparison of the letters. That is sometimes called "ASCIIbetical" sorting, because it involves using the value of the character in ASCII or some other encoding to determine how it sorts.
But there are rules in English for sorting characters, and similar rules in other languages. If you don't specifically tell String.Compare() what to do, it will always use culture-appropriate sorting. In English, capital letters always sort before lowercase letters, so "A" is less than "a" in terms of English sorting rules.
So let's walk through what each line does.
Code:
int a = string.Compare("Davis", "DAVIS", false); //-1
This is a case-insensitive comparison that uses the current culture for sorting, English on my machine. "D" and "D" are identical, so "a" and "A" are compared. In English, "Apple" is supposed to sort before "apple". So since "Da" sorts less than "DA", "a" < "A" and -1 is returned.
Code:
int b = Operators.CompareString("Davis", "DAVIS", false); //1
This is interesting. Operators.CompareString() has two neat things to say:
Quote:
This API supports the product infrastructure and is not intended to be used directly from your code.
Quote:
This performs a case-sensitive comparison that is either ordinal or based on the current culture, depending on the value of the statement.
For whatever reason, your line is meeting the "depending on the value of the statement" that causes Operators.CompareString() to perform ordinal comparison. That means it decides since "a" is 97 and "A" is 65, "a" > "A" and returns 1.
Unfortunately, I can't find reference source for Operators.CompareString() so I can't tell you why it decides to do an ordinal comparison here. This is probably why the documentation suggests you shouldn't call it directly. If you want to compare Strings in .NET, you should use String.Compare. It has an overload that lets you specify when you want to use ordinal comparison, but defaults to culture-specific comparison.
Re: C#'s string.Compare vs VB.NET's Operators.CompareString
Thanks Mr.Sitten. Your reply is very detailed.
The reason I used Operators.CompareString() is because the original code written in VB6 then VB.NET, now Boss ask for C#. I will take note on that.