c# 字符串比较优化

2021-01-14 17:11

阅读:362

 

一,优化举例

二,浅谈StringComparison

三,C# CultureInfo 类 各国语言对应的区域性名称

 

一,优化举例

我们在写程序的时候,经常会用到字符串对比。例如:if(IsCheck  == "true")

当大小写敏感的时候一般都用:

string.ToLower()或者string.ToUpper()变成统一的大小写模式再来比对数据。

 

其实这样不是很好比较方式,字符串在进行大小写转换时会消耗额外的性能。

我们应该使用:

string.Equals(dr["IsSelected"].ToString(), "true", StringComparison.OrdinalIgnoreCase)

来进行比较,以提升比较性能。

 

二,浅谈StringComparison

下面就来谈下StringComparison。

 

public enum StringComparison

 {

CurrentCulture,

CurrentCultureIgnoreCase,

InvariantCulture,

InvariantCultureIgnoreCase,

Ordinal,

OrdinalIgnoreCase

}

 

CurrentCulture 使用区域敏感排序规则和当前区域比较字符串。

CurrentCultureIgnoreCase 使用区域敏感排序规则、当前区域来比较字符串,同时忽略被比较字符串的大小写。

InvariantCulture 使用区域敏感排序规则和固定区域比较字符串。

InvariantCultureIgnoreCase 使用区域敏感排序规则、固定区域来比较字符串,同时忽略被比较字符串的大小写。

Ordinal 使用序号排序规则比较字符串。

OrdinalIgnoreCase 使用序号排序规则并忽略被比较字符串的大小写,对字符串进行比较。

 

1.首先是StringComparison.Ordinal       

在进行调用String.Compare(string1,string2,StringComparison.Ordinal)的时候是进行非语言(non-linguistic)上的比较,API运行时将会对两个字符串进行byte级别的比较,因此这种比较是比较严格和准确的,并且在性能上也很好,一般通过StringComparison.Ordinal来进行比较比使用String.Compare(string1,string2)来比较要快10倍左右.(可以写一个简单的小程序验证,这个挺让我惊讶,因为平时使用String.Compare从来就没想过那么多).StringComparison.OrdinalIgnoreCase就是忽略大小写的比较,同样是byte级别的比较.性能稍弱于StringComparison.Ordinal.

 

2.StringComparison.CurrentCulture      

   在当前的区域信息下进行比较,这是String.Compare在没有指定StringComparison的时候默认的比较方式.例子如下:

 

using UnityEngine;

using System.Collections;

using System;

using System.Threading;

using System.Globalization;

 

public class TEsss : MonoBehaviour

{

    void Start()

    {

        Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); //当前的区域信息是美国

        string s1 = "visualstudio";

        string s2 = "windows";

        //Console.WriteLine(String.Compare(s1, s2, StringComparison.CurrentCulture)); //输出"-1"

        Debug.Log(String.Compare(s1, s2, StringComparison.CurrentCulture));

        Thread.CurrentThread.CurrentCulture = new CultureInfo("sv-SE"); //当前的区域信息是瑞典 

        //Console.WriteLine(String.Compare(s1, s2, StringComparison.CurrentCulture)); //输出"1"

        Debug.Log(String.Compare(s1, s2, StringComparison.CurrentCulture));

    }

}

 PS:CultureInfo类在第三部分有讲解。

     为什么在瑞典里面 单词相同么?

      那两个单词不是相同,比较值为0才是相同。瑞典里边的字母与英语里边的字母部分一样,但有些不一样。同一个v代表的东西不一样。

 

3.StringComarison.InvariantCulture      

 

使用StringComarison.InvariantCulture来进行字符串比较,在任何系统中(不同的culture)比较都将得到相同的结果,他是使用CultureInfo.InvariantCulture的静态成员CompareInfo来进行比较操作的.例子如下:

 

            Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); //当前的区域信息是美国

            string s1 = "visualstudio";

            string s2 = "windows";

            Console.WriteLine(String.Compare(s1, s2,StringComparison.InvariantCulture)); //输出"-1"

 

            Thread.CurrentThread.CurrentCulture = new CultureInfo("sv-SE"); //当前的区域信息是瑞典

            Console.WriteLine(String.Compare(s1, s2,StringComparison.InvariantCulture)); //输出"-1"

 

 

三,C# CultureInfo 类 各国语言对应的区域性名称

CultureInfo 类保存区域性特定的信息,如关联的语言、子语言、国家/地区、日历和区域性约定。此类还提供对DateTimeFormatInfo、NumberFormatInfo、CompareInfo 和 TextInfo 的区域性特定实例的访问。这些对象包含区域性特定操作(如大小写、格式化日期和数字以及比较字符串)所需的信息。

String 类间接地使用此类来获取有关默认区域性的信息。

区域性名称和标识符

区域性名称遵循 RFC 1766 标准,格式为“-”,其中 是从 ISO 639-1 派生的由两个小写字母构成的代码, 是从 ISO 3166 派生的由两个大写字母构成的代码。例如,美国英语为“en-US”。在双字母语言代码不可用的情况中,将使用从 ISO 639-2 派生的三字母代码;例如,三字母代码“div”用于使用 Dhivehi 语言的区域。某些区域性名称带有指定书写符号的后缀;例如“-Cyrl”指定西里尔语书写符号,“-Latn”指定拉丁语书写符号。

System.Globalization 命名空间中的此类和其他类接受并使用下列预定义的区域性名称和标识符。

区域性名称

区域性标识符

语言-国家/地区

""(空字符串)

0x007F

固定区域性

af

0x0036

南非荷兰语

af-ZA

0x0436

南非荷兰语 - 南非

sq

0x001C

阿尔巴尼亚语

sq-AL

0x041C

阿尔巴尼亚语 - 阿尔巴尼亚

ar

0x0001

阿拉伯语

ar-DZ

0x1401

阿拉伯语 - 阿尔及利亚

ar-BH

0x3C01

阿拉伯语 - 巴林

ar-EG

0x0C01

阿拉伯语 - 埃及

ar-IQ

0x0801

阿拉伯语 - 伊拉克

ar-JO

0x2C01

阿拉伯语 - 约旦

ar-KW

0x3401

阿拉伯语 - 科威特

ar-LB

0x3001

阿拉伯语 - 黎巴嫩

ar-LY

0x1001

阿拉伯语 - 利比亚

ar-MA

0x1801

阿拉伯语 - 摩洛哥

ar-OM

0x2001

阿拉伯语 - 阿曼

ar-QA

0x4001

阿拉伯语 - 卡塔尔

ar-SA

0x0401

阿拉伯语 - 沙特阿拉伯

ar-SY

0x2801

阿拉伯语 - 叙利亚

ar-TN

0x1C01

阿拉伯语 - 突尼斯

ar-AE

0x3801

阿拉伯语 - 阿拉伯联合酋长国

ar-YE

0x2401

阿拉伯语 - 也门

hy

0x002B

亚美尼亚语

hy-AM

0x042B

亚美尼亚语 - 亚美尼亚

az

0x002C

阿泽里语

az-AZ-Cyrl

0x082C

阿泽里语(西里尔语)- 阿塞拜疆

az-AZ-Latn

0x042C

阿泽里语(拉丁)- 阿塞拜疆

eu

0x002D

巴斯克语

eu-ES

0x042D

巴斯克语 - 巴斯克地区

be

0x0023

白俄罗斯语

be-BY

0x0423

白俄罗斯语 - 白俄罗斯

bg

0x0002

保加利亚语

bg-BG

0x0402

保加利亚语 - 保加利亚

ca

0x0003

加泰罗尼亚语

ca-ES

0x0403

加泰罗尼亚语 - 加泰罗尼亚地区

zh-HK

0x0C04

中文 - 香港特别行政区

zh-MO

0x1404

中文 - 澳门特别行政区

zh-CN

0x0804

中文 - 中国

zh-CHS

0x0004

中文(简体)

zh-SG

0x1004

中文 - 新加坡

zh-TW

0x0404

中文 - 台湾

zh-CHT

0x7C04

中文(繁体)

hr

0x001A

克罗地亚语

hr-HR

0x041A

克罗地亚语 - 克罗地亚

cs

0x0005

捷克语

cs-CZ

0x0405

捷克语 - 捷克共和国

da

0x0006

丹麦语

da-DK

0x0406

丹麦语 - 丹麦

div

0x0065

马尔代夫语

div-MV

0x0465

马尔代夫语 - 马尔代夫

nl

0x0013

荷兰语

nl-BE

0x0813

荷兰语 - 比利时

nl-NL

0x0413

荷兰语 - 荷兰

en

0x0009

英语

en-AU

0x0C09

英语 - 澳大利亚

en-BZ

0x2809

英语 - 伯利兹

en-CA

0x1009

英语 - 加拿大

en-CB

0x2409

英语 - 加勒比

en-IE

0x1809

英语 - 爱尔兰

en-JM

0x2009

英语 - 牙买加

en-NZ

0x1409

英语 - 新西兰

en-PH

0x3409

英语 - 菲律宾

en-ZA

0x1C09

英语 - 南非

en-TT

0x2C09

英语 - 特立尼达和多巴哥

en-GB

0x0809

英语 - 英国

en-US

0x0409

英语 - 美国

en-ZW

0x3009

英语 - 津巴布韦

et

0x0025

爱沙尼亚语

et-EE

0x0425

爱沙尼亚语 - 爱沙尼亚

fo

0x0038

法罗语

fo-FO

0x0438

法罗语 - 法罗群岛

fa

0x0029

波斯语

fa-IR

0x0429

波斯语 - 伊朗

fi

0x000B

芬兰语

fi-FI

0x040B

芬兰语 - 芬兰

fr

0x000C

法语

fr-BE

0x080C

法语 - 比利时

fr-CA

0x0C0C

法语 - 加拿大

fr-FR

0x040C

法语 - 法国

fr-LU

0x140C

法语 - 卢森堡

fr-MC

0x180C

法语 - 摩纳哥

fr-CH

0x100C

法语 - 瑞士

gl

0x0056

加利西亚语

gl-ES

0x0456

加利西亚语 - 加利西亚地区

ka

0x0037

格鲁吉亚语

ka-GE

0x0437

格鲁吉亚语 - 格鲁吉亚

de

0x0007

德语

de-AT

0x0C07

德语 - 奥地利

de-DE

0x0407

德语 - 德国

de-LI

0x1407

德语 - 列支敦士登

de-LU

0x1007

德语 - 卢森堡

de-CH

0x0807

德语 - 瑞士

el

0x0008

希腊语

el-GR

0x0408

希腊语 - 希腊

gu

0x0047

古吉拉特语

gu-IN

0x0447

古吉拉特语 - 印度

he

0x000D

希伯来语

he-IL

0x040D

希伯来语 - 以色列

hi

0x0039

印地语

hi-IN

0x0439

印地语 - 印度

hu

0x000E

匈牙利语

hu-HU

0x040E

匈牙利语 - 匈牙利

is

0x000F

冰岛语

is-IS

0x040F

冰岛语 - 冰岛

id

0x0021

印度尼西亚语

id-ID

0x0421

印度尼西亚语 - 印度尼西亚

it

0x0010

意大利语

it-IT

0x0410

意大利语 - 意大利

it-CH

0x0810

意大利语 - 瑞士

ja

0x0011

日语

ja-JP

0x0411

日语 - 日本

kn

0x004B

卡纳达语

kn-IN

0x044B

卡纳达语 - 印度

kk

0x003F

哈萨克语

kk-KZ

0x043F

哈萨克语 - 哈萨克斯坦

kok

0x0057

贡根语

kok-IN

0x0457

贡根语 - 印度

ko

0x0012

朝鲜语

ko-KR

0x0412

朝鲜语 - 韩国

ky

0x0040

吉尔吉斯语

ky-KG

0x0440

吉尔吉斯语 - 吉尔吉斯坦

lv

0x0026

拉脱维亚语

lv-LV

0x0426

拉脱维亚语 - 拉脱维亚

lt

0x0027

立陶宛语

lt-LT

0x0427

立陶宛语 - 立陶宛

mk

0x002F

马其顿语

mk-MK

0x042F

马其顿语 - 前南斯拉夫联盟马其顿共和国

ms

0x003E

马来语

ms-BN

0x083E

马来语 - 文莱

ms-MY

0x043E

马来语 - 马来西亚

mr

0x004E

马拉地语

mr-IN

0x044E

马拉地语 - 印度

mn

0x0050

蒙古语

mn-MN

0x0450

蒙古语 - 蒙古

no

0x0014

挪威语

nb-NO

0x0414

挪威语(伯克梅尔)- 挪威

nn-NO

0x0814

挪威语(尼诺斯克)- 挪威

pl

0x0015

波兰语

pl-PL

0x0415

波兰语 - 波兰

pt

0x0016

葡萄牙语

pt-BR

0x0416

葡萄牙语 - 巴西

pt-PT

0x0816

葡萄牙语 - 葡萄牙

pa

0x0046

旁遮普语

pa-IN

0x0446

旁遮普语 - 印度

ro

0x0018

罗马尼亚语

ro-RO

0x0418

罗马尼亚语 - 罗马尼亚

ru

0x0019

俄语

ru-RU

0x0419

俄语 - 俄罗斯

sa

0x004F

梵语

sa-IN

0x044F

梵语 - 印度

sr-SP-Cyrl

0x0C1A

塞尔维亚语(西里尔语)- 塞尔维亚

sr-SP-Latn

0x081A

塞尔维亚语(拉丁)- 塞尔维亚

sk

0x001B

斯洛伐克语

sk-SK

0x041B

斯洛伐克语 - 斯洛伐克

sl

0x0024

斯洛文尼亚语

sl-SI

0x0424

斯洛文尼亚语 - 斯洛文尼亚

es

0x000A

西班牙语

es-AR

0x2C0A

西班牙语 - 阿根廷

es-BO

0x400A

西班牙语 - 玻利维亚

es-CL

0x340A

西班牙语 - 智利

es-CO

0x240A

西班牙语 - 哥伦比亚

es-CR

0x140A

西班牙语 - 哥斯达黎加

es-DO

0x1C0A

西班牙语  - 多米尼加共和国

es-EC

0x300A

西班牙语 - 厄瓜多尔

es-SV

0x440A

西班牙语 - 萨尔瓦多

es-GT

0x100A

西班牙语 - 危地马拉

es-HN

0x480A

西班牙语 - 洪都拉斯

es-MX

0x080A

西班牙语 - 墨西哥

es-NI

0x4C0A

西班牙语 - 尼加拉瓜

es-PA

0x180A

西班牙语 - 巴拿马

es-PY

0x3C0A

西班牙语 - 巴拉圭

es-PE

0x280A

西班牙 - 秘鲁

es-PR

0x500A

西班牙语 - 波多黎各

es-ES

0x0C0A

西班牙语 - 西班牙

es-UY

0x380A

西班牙语 - 乌拉圭

es-VE

0x200A

西班牙语 - 委内瑞拉

sw

0x0041

斯瓦希里语

sw-KE

0x0441

斯瓦希里语 - 肯尼亚

sv

0x001D

瑞典语

sv-FI

0x081D

瑞典语 - 芬兰

sv-SE

0x041D

瑞典语 - 瑞典

syr

0x005A

叙利亚语

syr-SY

0x045A

叙利亚语 - 叙利亚

ta

0x0049

泰米尔语

ta-IN

0x0449

泰米尔语 - 印度

tt

0x0044

鞑靼语

tt-RU

0x0444

鞑靼语 - 俄罗斯

te

0x004A

泰卢固语

te-IN

0x044A

泰卢固语 - 印度

th

0x001E

泰语

th-TH

0x041E

泰语 - 泰国

tr

0x001F

土耳其语

tr-TR

0x041F

土耳其语 - 土耳其

uk

0x0022

乌克兰语

uk-UA

0x0422

乌克兰语 - 乌克兰

ur

0x0020

乌尔都语

ur-PK

0x0420

乌尔都语 - 巴基斯坦

uz

0x0043

乌兹别克语

uz-UZ-Cyrl

0x0843

乌兹别克语(西里尔语)- 乌兹别克斯坦

uz-UZ-Latn

0x0443

乌兹别克语(拉丁)- 乌兹别克斯坦

vi

0x002A

越南语

vi-VN

0x042A

越南语 - 越南

固定区域性、非特定区域性和特定区域性

这些区域性通常分为三个集合:固定区域性、非特定区域性和特定区域性。

固定区域性不区分区域性。可以使用空字符串 ("") 按名称或者按区域性标识符 0x007F 来指定固定区域性。InvariantCulture 检索固定区域性的实例。它与英语语言关联,但不与任何国家/地区关联。它几乎可用在要求区域性的“全局化”命名空间中的所有方法中。

非特定区域性是与某种语言关联但不与国家/地区关联的区域性。特定区域性是与某种语言和某个国家/地区关联的区域性。例如,“fr”是非特定区域性,而“fr-FR”是特定区域性。注意,“zh-CHS”(简体中文)和“zh-CHT”(繁体中文)均为非特定区域性。

请注意,不建议为非特定区域性创建 CompareInfo 类的实例,这是因为它包含的数据是任意的。若要显示数据并对其进行排序,请同时指定语言和地区。此外,为非特定区域性创建的 CompareInfo 对象的 Name 属性仅返回国家,且不包括地区。

区域性有层次结构,即特定区域性的父级是非特定区域性,而非特定区域性的父级是 InvariantCulture。Parent 属性将返回与特定区域性关联的非特定区域性。

如果特定区域性的资源在系统中不可用,则使用非特定区域性的资源;如果非特定区域性的资源也不可用,那么使用主程序集中嵌入的资源。

 

文章参考:

http://www.cnblogs.com/zhw511006/archive/2010/07/09/1774591.html

http://blog.csdn.net/dannywj1371/article/details/6936147

http://blog.csdn.net/lhy2199/article/details/7410694

 


评论


亲,登录后才可以留言!