CompareOptions Enum
Definitie
Belangrijk
Bepaalde informatie heeft betrekking op een voorlopige productversie die aanzienlijk kan worden gewijzigd voordat deze wordt uitgebracht. Microsoft biedt geen enkele expliciete of impliciete garanties met betrekking tot de informatie die hier wordt verstrekt.
Definieert de tekenreeksvergelijkingsopties die moeten worden gebruikt met CompareInfo.
Deze opsomming ondersteunt een bitsgewijze combinatie van de waarden van de leden.
public enum class CompareOptions
[System.Flags]
public enum CompareOptions
[System.Flags]
[System.Serializable]
public enum CompareOptions
[System.Flags]
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public enum CompareOptions
[<System.Flags>]
type CompareOptions =
[<System.Flags>]
[<System.Serializable>]
type CompareOptions =
[<System.Flags>]
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type CompareOptions =
Public Enum CompareOptions
- Overname
- Kenmerken
Velden
| Name | Waarde | Description |
|---|---|---|
| None | 0 | Een tekenreeksvergelijking met standaardoptie-instellingen. |
| IgnoreCase | 1 | Een tekenreeksvergelijking die hoofdletterverschillen negeert. |
| IgnoreNonSpace | 2 | Een tekenreeksvergelijking die het combineren van tekens, zoals diakritische tekens, negeert. Niet-pacing-tekens wijzigen basistekens zonder dat ze hun eigen ruimte in beslag nemen. De Unicode-standaard definieert het combineren van tekens als tekens die worden gecombineerd met basistekens om een nieuw teken te produceren. |
| IgnoreSymbols | 4 | Een tekenreeksvergelijking die symbolen negeert, waaronder witruimte, interpunctie, valutasymbolen, het procentteken, wiskundige symbolen, het ampersand en vergelijkbare tekens. |
| IgnoreKanaType | 8 | Een tekenreeksvergelijking die het kana-type negeert. Kana-type verwijst naar Japanse hiragana- en katakana-tekens, die fonetische geluiden vertegenwoordigen. Hiragana wordt gebruikt voor native Japanse woorden, terwijl katakana wordt gebruikt voor woorden die zijn geleend uit andere talen. Met deze optie worden hiragana- en katakana-tekens die hetzelfde geluid vertegenwoordigen als gelijk beschouwd. |
| IgnoreWidth | 16 | Een tekenreeksvergelijking die de tekenbreedte negeert. Zo worden vormen van Japanse katakana-tekens in volledige breedte en halve breedte beschouwd als gelijk aan deze optie. |
| OrdinalIgnoreCase | 268435456 | Een tekenreeksvergelijking die hoofdletters negeert en vervolgens een rangtelvergelijking uitvoert. Deze techniek is gelijk aan het converteren van de tekenreeks naar hoofdletters met behulp van de invariante cultuur en het uitvoeren van een rangtelvergelijking op het resultaat.
|
| StringSort | 536870912 | Een tekenreeksvergelijking die gebruikmaakt van het tekenreekssorteeralgoritme, waarbij niet-alfanumerieke tekens (zoals afbreekstreepjes en apostrofs) worden gesorteerd vóór alfanumerieke tekens. |
| Ordinal | 1073741824 | Een tekenreeksvergelijking die gebruikmaakt van de Met Unicode UTF-16 gecodeerde waarden van de tekenreeksen, waarbij deze code-eenheid per code-eenheid worden vergeleken. Dit resulteert in een snelle, cultuurongevoelige vergelijking waarbij tekenreeksen alleen worden geordend op basis van hun binaire waarden. Deze optie kan niet worden gecombineerd met andere CompareOptions waarden en moet alleen worden gebruikt. |
Voorbeelden
In het volgende codevoorbeeld ziet u hoe elk van de CompareOptions waarden van invloed is op tekenreeksvergelijkingen.
using System;
using System.Globalization;
public class CompareOptionsExample
{
public static void Run()
{
// Uppercase and lowercase characters are equivalent (according to the culture rules)
// when IgnoreCase is used.
TestStringEquality("ONE two", "one TWO", "Case sensitivity", CompareOptions.IgnoreCase);
// Punctuation is ignored with the IgnoreSymbols option.
TestStringEquality("hello world", "hello, world!", "Punctuation", CompareOptions.IgnoreSymbols);
// Whitespace and mathematical symbols are also ignored with IgnoreSymbols.
TestStringEquality("3 + 5 = 8", "358", "Whitespace and mathematical symbols", CompareOptions.IgnoreSymbols);
// Caution: currency symbols and thousands separators are ignored with IgnoreSymbols.
// Parse strings containing numbers/currency and compare them numerically instead.
TestStringEquality("Total $15,000", "Total: £150.00", "Currency symbols, decimals and thousands separators", CompareOptions.IgnoreSymbols);
// Full width characters are common in East Asian languages. Use the IgnoreWidth
// option to treat full- and half-width characters as equal.
TestStringEquality("abc,-", "abc,-", "Half width and full width characters", CompareOptions.IgnoreWidth);
// The same string in Hiragana and Katakana is equal when IgnoreKanaType is used.
TestStringEquality("ありがとう", "アリガトウ", "Hiragana and Katakana strings", CompareOptions.IgnoreKanaType);
// When comparing with the IgnoreNonSpace option, characters like diacritical marks are ignored.
TestStringEquality("café", "cafe", "Diacritical marks", CompareOptions.IgnoreNonSpace);
// Ligature characters and their non-ligature forms compare equal with the IgnoreNonSpace option.
// Note: prior to .NET 5, ligature characters were equal to their expanded forms by default.
TestStringEquality("straße œuvre cæsar", "strasse oeuvre caesar", "Ligature characters", CompareOptions.IgnoreNonSpace);
}
private static void TestStringEquality(string str1, string str2, string description, CompareOptions options)
{
Console.WriteLine(Environment.NewLine + description + ":");
// First test with the default CompareOptions then with the provided options
TestStringEquality(str1, str2, CompareOptions.None);
TestStringEquality(str1, str2, options);
}
private static void TestStringEquality(string str1, string str2, CompareOptions options)
{
Console.Write($" When using CompareOptions.{options}, \"{str1}\" and \"{str2}\" are ");
if (string.Compare(str1, str2, CultureInfo.InvariantCulture, options) != 0)
{
Console.Write("not ");
}
Console.WriteLine("equal.");
}
}
/*
In .NET 5 and later, the output is the following:
Case sensitivity:
When using CompareOptions.None, "ONE two" and "one TWO" are not equal.
When using CompareOptions.IgnoreCase, "ONE two" and "one TWO" are equal.
Punctuation:
When using CompareOptions.None, "hello world" and "hello, world!" are not equal.
When using CompareOptions.IgnoreSymbols, "hello world" and "hello, world!" are equal.
Whitespace and mathematical symbols:
When using CompareOptions.None, "3 + 5 = 8" and "358" are not equal.
When using CompareOptions.IgnoreSymbols, "3 + 5 = 8" and "358" are equal.
Currency symbols, decimals and thousands separators:
When using CompareOptions.None, "Total $15,000" and "Total: £150.00" are not equal.
When using CompareOptions.IgnoreSymbols, "Total $15,000" and "Total: £150.00" are equal.
Half width and full width characters:
When using CompareOptions.None, "abc,-" and "abc,-" are not equal.
When using CompareOptions.IgnoreWidth, "abc,-" and "abc,-" are equal.
Hiragana and Katakana strings:
When using CompareOptions.None, "ありがとう" and "アリガトウ" are not equal.
When using CompareOptions.IgnoreKanaType, "ありがとう" and "アリガトウ" are equal.
Diacritical marks:
When using CompareOptions.None, "café" and "cafe" are not equal.
When using CompareOptions.IgnoreNonSpace, "café" and "cafe" are equal.
Ligature characters:
When using CompareOptions.None, "straße œuvre cæsar" and "strasse oeuvre caesar" are not equal.
When using CompareOptions.IgnoreNonSpace, "straße œuvre cæsar" and "strasse oeuvre caesar" are equal.
Note: When using .NET versions prior to .NET 5, ligature characters compare as equal to their
non-ligature counterparts by default, so the last test will output as follows:
Ligature characters:
When using CompareOptions.None, "straße œuvre cæsar" and "strasse oeuvre caesar" are equal.
When using CompareOptions.IgnoreNonSpace, "straße œuvre cæsar" and "strasse oeuvre caesar" are equal.
*/
module compareoptions_values
open System
open System.Globalization
let testStringEquality (str1: string) (str2: string) (description: string) (options: CompareOptions) =
printfn "\n%s:" description
let compareAndPrint opts =
let result = String.Compare(str1, str2, CultureInfo.InvariantCulture, opts)
let equalityStatus = if result = 0 then "equal" else "not equal"
printfn " When using CompareOptions.%A, \"%s\" and \"%s\" are %s." opts str1 str2 equalityStatus
compareAndPrint CompareOptions.None
compareAndPrint options
[<EntryPoint>]
let main argv =
// Uppercase and lowercase characters are equivalent (according to the culture rules) when IgnoreCase is used.
testStringEquality "ONE two" "one TWO" "Case sensitivity" CompareOptions.IgnoreCase
// Punctuation is ignored with the IgnoreSymbols option.
testStringEquality "hello world" "hello, world!" "Punctuation" CompareOptions.IgnoreSymbols
// Whitespace and mathematical symbols are also ignored with IgnoreSymbols.
testStringEquality "3 + 5 = 8" "358" "Whitespace and mathematical symbols" CompareOptions.IgnoreSymbols
// Caution: currency symbols and thousands separators are ignored with IgnoreSymbols.
// Parse strings containing numbers/currency and compare them numerically instead.
testStringEquality "Total $15,000" "Total: £150.00" "Currency symbols, decimals and thousands separators" CompareOptions.IgnoreSymbols
// Full width characters are common in East Asian languages. Use the IgnoreWidth
// option to treat full- and half-width characters as equal.
testStringEquality "abc,-" "abc,-" "Half width and full width characters" CompareOptions.IgnoreWidth
// The same string in Hiragana and Katakana is equal when IgnoreKanaType is used.
testStringEquality "ありがとう" "アリガトウ" "Hiragana and Katakana strings" CompareOptions.IgnoreKanaType
// When comparing with the IgnoreNonSpace option, characters like diacritical marks are ignored.
testStringEquality "café" "cafe" "Diacritical marks" CompareOptions.IgnoreNonSpace
// Ligature characters and their non-ligature forms compare equal with the IgnoreNonSpace option.
// Note: prior to .NET 5, ligature characters were equal to their expanded forms by default.
testStringEquality "straße œuvre cæsar" "strasse oeuvre caesar" "Ligature characters" CompareOptions.IgnoreNonSpace
0 // return an integer exit code
(*
In .NET 5 and later, the output will be the following:
Case sensitivity:
When using CompareOptions.None, "ONE two" and "one TWO" are not equal.
When using CompareOptions.IgnoreCase, "ONE two" and "one TWO" are equal.
Punctuation:
When using CompareOptions.None, "hello world" and "hello, world!" are not equal.
When using CompareOptions.IgnoreSymbols, "hello world" and "hello, world!" are equal.
Whitespace and mathematical symbols:
When using CompareOptions.None, "3 + 5 = 8" and "358" are not equal.
When using CompareOptions.IgnoreSymbols, "3 + 5 = 8" and "358" are equal.
Currency symbols, decimals and thousands separators:
When using CompareOptions.None, "Total $15,000" and "Total: £150.00" are not equal.
When using CompareOptions.IgnoreSymbols, "Total $15,000" and "Total: £150.00" are equal.
Half width and full width characters:
When using CompareOptions.None, "abc,-" and "abc,-" are not equal.
When using CompareOptions.IgnoreWidth, "abc,-" and "abc,-" are equal.
Hiragana and Katakana strings:
When using CompareOptions.None, "ありがとう" and "アリガトウ" are not equal.
When using CompareOptions.IgnoreKanaType, "ありがとう" and "アリガトウ" are equal.
Diacritical marks:
When using CompareOptions.None, "café" and "cafe" are not equal.
When using CompareOptions.IgnoreNonSpace, "café" and "cafe" are equal.
Ligature characters:
When using CompareOptions.None, "straße œuvre cæsar" and "strasse oeuvre caesar" are not equal.
When using CompareOptions.IgnoreNonSpace, "straße œuvre cæsar" and "strasse oeuvre caesar" are equal.
Note: when using .NET versions prior to .NET 5, ligature characters compare as equal to their
non-ligature counterparts by default, so the last test will output as follows:
Ligature characters:
When using CompareOptions.None, "straße œuvre cæsar" and "strasse oeuvre caesar" are equal.
When using CompareOptions.IgnoreNonSpace, "straße œuvre cæsar" and "strasse oeuvre caesar" are equal.
*)
Imports System
Imports System.Globalization
Module CompareOptionsExample
Sub Main()
' Uppercase and lowercase characters are equivalent (according to the culture rules)
' when IgnoreCase is used.
TestStringEquality("ONE two", "one TWO", "Case sensitivity", CompareOptions.IgnoreCase)
' Punctuation is ignored with the IgnoreSymbols option.
TestStringEquality("hello world", "hello, world!", "Punctuation", CompareOptions.IgnoreSymbols)
' Whitespace and mathematical symbols are also ignored with IgnoreSymbols.
TestStringEquality("3 + 5 = 8", "358", "Whitespace and mathematical symbols", CompareOptions.IgnoreSymbols)
' Caution: currency symbols and thousands separators are ignored with IgnoreSymbols.
' Parse strings containing numbers/currency and compare them numerically instead.
TestStringEquality("Total $15,000", "Total: £150.00", "Currency symbols, decimals and thousands separators", CompareOptions.IgnoreSymbols)
' Full width characters are common in East Asian languages. Use the IgnoreWidth
' option to treat full- and half-width characters as equal.
TestStringEquality("abc,-", "abc,-", "Half width and full width characters", CompareOptions.IgnoreWidth)
' The same string in Hiragana and Katakana is equal when IgnoreKanaType is used.
TestStringEquality("ありがとう", "アリガトウ", "Hiragana and Katakana strings", CompareOptions.IgnoreKanaType)
' When comparing with the IgnoreNonSpace option, characters like diacritical marks are ignored.
TestStringEquality("café", "cafe", "Diacritical marks", CompareOptions.IgnoreNonSpace)
' Ligature characters and their non-ligature forms compare equal with the IgnoreNonSpace option.
' Note: prior to .NET 5, ligature characters were equal to their expanded forms by default.
TestStringEquality("straße œuvre cæsar", "strasse oeuvre caesar", "Ligature characters", CompareOptions.IgnoreNonSpace)
End Sub
Private Sub TestStringEquality(str1 As String, str2 As String, description As String, options As CompareOptions)
Console.WriteLine(Environment.NewLine & description & ":")
' First test with the default CompareOptions then with the provided options
TestStringEqualityWithOptions(str1, str2, CompareOptions.None)
TestStringEqualityWithOptions(str1, str2, options)
End Sub
Private Sub TestStringEqualityWithOptions(str1 As String, str2 As String, options As CompareOptions)
Console.Write($" When using CompareOptions.{options}, ""{str1}"" and ""{str2}"" are ")
If String.Compare(str1, str2, CultureInfo.InvariantCulture, options) <> 0 Then
Console.Write("not ")
End If
Console.WriteLine("equal.")
End Sub
End Module
' In .NET 5 and later, the output is the following:
'
'Case sensitivity :
' When using CompareOptions.None, "ONE two" and "one TWO" are not equal.
' When using CompareOptions.IgnoreCase, "ONE two" and "one TWO" are equal.
'
'Punctuation:
' When using CompareOptions.None, "hello world" and "hello, world!" are not equal.
' When using CompareOptions.IgnoreSymbols, "hello world" and "hello, world!" are equal.
'
'Whitespace And mathematical symbols:
' When using CompareOptions.None, "3 + 5 = 8" and "358" are not equal.
' When using CompareOptions.IgnoreSymbols, "3 + 5 = 8" and "358" are equal.
'
'Currency symbols, decimals And thousands separators:
' When using CompareOptions.None, "Total $15,000" and "Total: £150.00" are not equal.
' When using CompareOptions.IgnoreSymbols, "Total $15,000" and "Total: £150.00" are equal.
'
'Half width And full width characters:
' When using CompareOptions.None, "abc,-" and "abc,-" are not equal.
' When using CompareOptions.IgnoreWidth, "abc,-" and "abc,-" are equal.
'
'Hiragana And Katakana strings:
' When using CompareOptions.None, "ありがとう" and "アリガトウ" are not equal.
' When using CompareOptions.IgnoreKanaType, "ありがとう" and "アリガトウ" are equal.
'
'Diacritical marks :
' When using CompareOptions.None, "café" and "cafe" are not equal.
' When using CompareOptions.IgnoreNonSpace, "café" and "cafe" are equal.
'
'Ligature characters :
' When using CompareOptions.None, "straße œuvre cæsar" and "strasse oeuvre caesar" are not equal.
' When using CompareOptions.IgnoreNonSpace, "straße œuvre cæsar" and "strasse oeuvre caesar" are equal.
'
' Note: when using .NET versions prior to .NET 5, ligature characters compare as equal to their
' non-ligature counterparts by default, so the last test will output as follows:
'
'Ligature characters :
' When using CompareOptions.None, "straße œuvre cæsar" and "strasse oeuvre caesar" are equal.
' When using CompareOptions.IgnoreNonSpace, "straße œuvre cæsar" and "strasse oeuvre caesar" are equal.
In het volgende codevoorbeeld ziet u hoe sorteren met StringSort verschilt van sorteren zonder StringSort.
using System;
using System.Collections.Generic;
using System.Globalization;
public class StringSort
{
public static void Run()
{
var wordList = new List<string>
{
"cant", "bill's", "coop", "cannot", "billet", "can't", "con", "bills", "co-op"
};
Console.WriteLine("Before sorting:");
foreach (string word in wordList)
{
Console.WriteLine(word);
}
Console.WriteLine(Environment.NewLine + "After sorting with CompareOptions.None:");
SortAndDisplay(wordList, CompareOptions.None);
Console.WriteLine(Environment.NewLine + "After sorting with CompareOptions.StringSort:");
SortAndDisplay(wordList, CompareOptions.StringSort);
}
// Sort the list of words with the supplied CompareOptions.
private static void SortAndDisplay(List<string> unsorted, CompareOptions options)
{
// Create a copy of the original list to sort.
var words = new List<string>(unsorted);
// Define the CompareInfo to use to compare strings.
CompareInfo comparer = CultureInfo.InvariantCulture.CompareInfo;
// Sort the copy with the supplied CompareOptions then display.
words.Sort((str1, str2) => comparer.Compare(str1, str2, options));
foreach (string word in words)
{
Console.WriteLine(word);
}
}
}
/*
CompareOptions.None and CompareOptions.StringSort provide identical ordering by default
in .NET 5 and later. But in prior versions, the output is the following:
Before sorting:
cant
bill's
coop
cannot
billet
can't
con
bills
co-op
After sorting with CompareOptions.None:
billet
bills
bill's
cannot
cant
can't
con
coop
co-op
After sorting with CompareOptions.StringSort:
bill's
billet
bills
can't
cannot
cant
co-op
con
coop
*/
module compareoptions_stringsort
open System
open System.Collections.Generic
open System.Globalization
let sortAndDisplay (unsorted: List<string>) (options: CompareOptions) =
let words = new List<string>(unsorted)
let comparer = CultureInfo.InvariantCulture.CompareInfo
words.Sort((fun str1 str2 -> comparer.Compare(str1, str2, options)))
for word in words do
printfn "%s" word
[<EntryPoint>]
let main argv =
let wordList = new List<string>(
["cant"; "bill's"; "coop"; "cannot"; "billet"; "can't"; "con"; "bills"; "co-op"])
printfn "Before sorting:"
for word in wordList do
printfn "%s" word
printfn "\nAfter sorting with CompareOptions.None:"
sortAndDisplay wordList CompareOptions.None
printfn "\nAfter sorting with CompareOptions.StringSort:"
sortAndDisplay wordList CompareOptions.StringSort
0 // return an integer exit code
(*
CompareOptions.None and CompareOptions.StringSort provide identical ordering by default
in .NET 5 and later, but in prior versions, the output will be the following:
Before sorting:
cant
bill's
coop
cannot
billet
can't
con
bills
co-op
After sorting with CompareOptions.None:
billet
bills
bill's
cannot
cant
can't
con
coop
co-op
After sorting with CompareOptions.StringSort:
bill's
billet
bills
can't
cannot
cant
co-op
con
coop
*)
Imports System
Imports System.Collections.Generic
Imports System.Globalization
Public Class StringSort
Public Shared Sub Main()
Dim wordList As New List(Of String) From {
"cant", "bill's", "coop", "cannot", "billet", "can't", "con", "bills", "co-op"
}
Console.WriteLine("Before sorting:")
For Each word In wordList
Console.WriteLine(word)
Next
Console.WriteLine(Environment.NewLine & "After sorting with CompareOptions.None:")
SortAndDisplay(wordList, CompareOptions.None)
Console.WriteLine(Environment.NewLine & "After sorting with CompareOptions.StringSort:")
SortAndDisplay(wordList, CompareOptions.StringSort)
End Sub
' Sort the list of words with the supplied CompareOptions.
Private Shared Sub SortAndDisplay(unsorted As List(Of String), options As CompareOptions)
' Create a copy of the original list to sort.
Dim words As New List(Of String)(unsorted)
' Define the CompareInfo to use to compare strings.
Dim comparer As CompareInfo = CultureInfo.InvariantCulture.CompareInfo
' Sort the copy with the supplied CompareOptions then display.
words.Sort(Function(str1, str2) comparer.Compare(str1, str2, options))
For Each word In words
Console.WriteLine(word)
Next
End Sub
End Class
' CompareOptions.None and CompareOptions.StringSort provide identical ordering by default
' in .NET 5 And later, but in prior versions, the output is the following:
'
'Before sorting
'cant
'bill's
'coop
'cannot
'billet
'can't
'con
'bills
'co-op
'After sorting with CompareOptions.None
'billet
'bills
'bill's
'cannot
'cant
'can't
'con
'coop
'co-op
'After sorting with CompareOptions.StringSort
'bill's
'billet
'bills
'can't
'cannot
'cant
'co-op
'con
'coop
Opmerkingen
In .NET 5 en hoger wordt de platformoverschrijdende ICU-bibliotheek (International Components for Unicode) gebruikt voor tekenreeksverwerking. De ICU-bibliotheek brengt de volgende wijzigingen aan het vergelijkingsgedrag van tekenreeksen:
- De standaardoptie
Noneis gelijk aan deStringSortoptie. De vorige functionaliteit vanNone, waarbij gelijke weging is gegeven aan alfanumerieke en niet-anafaanumerische tekens, is niet meer beschikbaar. - Ligaturen (gecombineerde tekens zoals 'æ' en 'æ') worden standaard gezien als verschillend van hun uitgevouwen vormen ('ae', 'oe') in tekenreeksvergelijkingen. Als u ligaturen en hun uitgevouwen vormen als gelijkwaardig wilt behandelen, gebruikt u de
IgnoreNonSpaceoptie.
Zie .NET globalisatie en ICU voor meer informatie over de wijziging, waaronder het herstellen van de vorige Unicode-handler.
Zie Aanvullende API-opmerkingen voor CompareOptions voor meer informatie over deze API.