c# 字符串比较优化
一,优化举例
二,浅谈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 标准,格式为“<languagecode2>-<country/regioncode2>”,其中 <languagecode2> 是从 ISO 639-1 派生的由两个小写字母构成的代码,<country/regioncode2> 是从 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
c# 字符串比较优化的更多相关文章
- Sql动态查询拼接字符串的优化
Sql动态查询拼接字符串的优化 最原始的 直接写:string sql="select * from TestTables where 1=1";... 这样的代码效率很低的,这样 ...
- String字符串性能优化的几种方案
String字符串是系统里最常用的类型之一,在系统中占据了很大的内存,因此,高效地使用字符串,对系统的性能有较好的提升. 针对字符串的优化,我在工作与学习过程总结了以下三种方案作分享: 一.优化构建的 ...
- String字符串性能优化的探究
一.背景 String 对象是我们使用最频繁的一个对象类型,但它的性能问题却是最容易被忽略的.String 对象作为 Java 语言中重要的数据类型,是内存中占用空间最大的一个对象,高效地使用字符串, ...
- java中的字符串简介,字符串的优化以及如何高效率的使用字符串
简介 String最为java中最重要的数据类型.字符串是软件开发中最重要的对象之一,通常,字符串对象在内存中总是占据着最大的空间块.所以,高效处理字符串,将提高系统的整个性能. 在java语言中,S ...
- 关于java字符串编译优化问题
情景一:不好的字符串拼接习惯 起因是这样的:一个大牛在写了一篇关于java字符串优化问题的讲解,他提到:不要使用strObj+otherValue的方法将otherValue转换为字符串形式,因 ...
- JS字符串拼接优化
// 请把以下用于连接字符串的JavaScript代码修改为更高效的方式 var htmlString = ‘ < div class=”container” > ’ + ‘ < u ...
- js正则表达式匹配字符串与优化过程
前言 有时候需要实现对js源文件中的url字符串做拦截预处理,或者前端js语法高亮,或者需要对动态加载的关键源码做混淆保护,在某些步骤实现之前,有一个步骤是需要提炼出所有的合法字符串. 目标:检测源文 ...
- c# 优化代码的一些规则——字符串使用优化[四]
前言 在我们的程序中,经常使用到字符串,字符串的写法非常多,但是有一个问题就是我们写的字符串是否合适呢? 正文 内插符 介绍一个东西叫做内插字符,如下: static void Main(string ...
- MySQL 字符串索引优化方案
字符串建立索引的优化 1. 建立前缀索引 假设建立一个支持邮箱登录的用户表,对于邮件字段来说,可以有以下几种建立索引的方式: 直接对整个字符串建立索引 alter table SUser add in ...
随机推荐
- 【游戏体验】Colour My World(让我的世界充满色彩)
这是一款玩法简单的游戏 但是它给你的感觉不一样 推荐试玩 个人测评 游戏性 7/10 音乐 9/10 剧情 6/10 总评 22/30
- C#中字符串常用方法
string str = "123@163.com"; int index = str.IndexOf('@'); // 返回3 从左向右第一个@ int index = str ...
- Python 语法特点:注释/编写规则/命名规范
1.注释 1)单行注释 # 2) 多行注释 前后三个单引号或双引号 ‘’‘ ... ''' """ ...""" ...
- 再有人问你HashMap,把这篇文章甩给他!
声明:本文以jdk1.8为主! 搞定HashMap 作为一个Java从业者,面试的时候肯定会被问到过HashMap,因为对于HashMap来说,可以说是Java==集合中的精髓==了,如果你觉得自己对 ...
- WEB - 关于rel="noopener"
参考网址 https://mathiasbynens.github.io/rel-noopener/ 例子 <a href="https://cli.vuejs.org" t ...
- 使用php-vmstat遇到的麻烦
workerman-vmstat是一个基于workerman的扩展,用于监听服务器应用对内存.cpu消耗的友好的查看功能,具体介绍可以去git上看: https://github.com/wal ...
- django之orm的高级操作以及xcc安全攻击
查询用法大全: 1. 比较运算符 # id > 3 res = models.UserInfo.objects.filter(id__gt=3) # id >= 3 res = model ...
- Java入门笔记 05-多线程
介绍:Java提供了非常优秀的多线程支持,程序可以通过非常简单的方式来启动多线程.本章主要内容为:多线程的创建.启动.控制以及同步操作,并介绍JDK 5新增的线程创建方式. 一.线程的创建与使用: 1 ...
- 为 git 设定 socks5 代理
为 git 设定 socks5 代理 查看当前设定 git config --global -l 为 git 设定全局代理 git config --global http.proxy socks5h ...
- ln N! -> N(lnN -1)