学习。求C#中:IndexOf(String, StringComparison) 示例。学习

学习。求C#中:IndexOf(String, StringComparison) 示例。学习,第1张

public enum StringComparison {

CurrentCulture,

CurrentCultureIgnoreCase,

InvariantCulture,

InvariantCultureIgnoreCase,

Ordinal,

OrdinalIgnoreCase

}

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

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

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

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

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

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

1首先是StringComparisonOrdinal

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

2StringComparisonCurrentCulture

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

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

string s1 = "visualstudio";

string s2 = "windows";

ConsoleWriteLine(StringCompare(s1, s2,StringComparisonCurrentCulture)); //输出"-1"

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

ConsoleWriteLine(StringCompare(s1, s2,StringComparisonCurrentCulture)); //输出"1"

StringComarisonCurrentCultureIgnoreCase指在当前区域信息下忽略大小写的比较

3StringComarisonInvariantCulture

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

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

string s1 = "visualstudio";

string s2 = "windows";

ConsoleWriteLine(StringCompare(s1, s2,StringComparisonInvariantCulture)); //输出"-1"

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

ConsoleWriteLine(StringCompare(s1, s2,StringComparisonInvariantCulture)); //输出"-1"

没有什么好办法,只有用switch。将输入的值储存到一个string变量中,然后swtich+case一长串

用enum没有意义的,因为enum在c++里经过编译后实际上就是多个const整型,你的定义其实差不多相当于

const int ROCK=0;

const int SCISSOR=1;

const int CLOTH=2;

……

当然还是有一定差距的,就是在于你可以定义一个变量,内容限定为enum中的这些整型的值。然后,就我所知,没有其他的差别了

所以完全没办法把他们关联到字符串上。

声明一个方向的枚举,包含四个枚举值: 东/西/南/北

Swift 的枚举成员在被创建时本身就是完备的值,这些值的类型是已经明确定义好的 Direction 类型 不会像 Objective-C 一样被赋予一个默认的整型值。在上面的 Direction 例子中,east、west 、north、south不会被隐式地赋值为 0,1,2 和 3。

Swift 中的枚举更加灵活,不必给每一个枚举成员提供一个值。如果给枚举成员提供一个值(称为原始值),则该值的类型可以是:字符串、字符、任意的整数值或浮点类型。

Swift的枚举类型提供了一个叫原始值(RawValues)的实现,它为枚举项提供了一个默认值,这个默认值在编译期间就是确定的。

通过原值值获取的枚举项是可选类型的,所以需要用if let 做一下判断。

未指定枚举值类型

隐式原始值

隐式原始值下枚举项使用系统的分配值:

显式原始值

隐式 + 显式原始值

这里使用了属性观察者,Swift里面的枚举更像一个对象,因此可以很方便的使用属性观察者对枚举值进行监听。

在 Swift 中,还可以定义这样的枚举类型,它的每一个枚举项都有一个附加信息,来扩充这个枚举项的信息表示,这又叫做关联值。

一定要学会使用关联值,这一点很重要。具体的使用后面的第九节会细说

通常情况下枚举是很容易进行相等判断的。一旦为枚举增加了关联值,Swift就没法正确的比较了,需要自己对该枚举实现 == 运算符。

借助 Comparable 协议,来实现枚举的比较。

遵守 CaseIterable 协议的swift枚举是可以遍历的,通过allCases获取所有的枚举成员

app里面的接口地址,如果都放一起,命名或者寻找都不方便,可以用枚举的嵌套来设计。可以分散在多个文件中,方便维护和管理。

用枚举来管理系统里面的常量是一个不错的选择。

枚举中不能使用存储属性,但是可以使用计算属性,计算属性的内容是在枚举值或者枚举关联值中得到的。

在这里,可以认为枚举是一个类,introduced是一个成员方法,AppleDeivceiPhone 就是一个AppleDeivce的实例,case们是它的属性。introduced里面的switch self,其实就是遍历这个匿名属性的所有场景,如iPad,iPhone等,然后根据不同的场景返回不同的值。

可以做枚举的自定义构造方法。

系统的打印协议

让枚举遵守这个协议

枚举可以进行扩展。可以将枚举中的case与method/protocol分隔开,阅读者可以快速消化枚举的内容。

设计一个网络类下的错误信息的处理功能。

在项目中经常使用 UserDefaults 来存储一下简单的用户信息。但是对 Key 的维护不会很方便。而且会想不起来。用枚举+结构体就能很好的解决这个问题。

这么设计APP的存储模块,是不是更有层级感,更加方便使用呢?

递归枚举是拥有另一个枚举作为枚举成员关联值的枚举。当编译器 *** 作递归枚举时必须插入间接寻址层。可以在声明枚举成员之前使用 indirect关键字来明确它是递归的。 也可以声明在整个枚举前,让所有的枚举成员都是递归的。

如果数值是尽可能连续的可以用一个数组存放对应的字符串

类似 char xxx[] = {"zero", "one", "two", "three",};

如果不是写一个函数类似

char f(int x)

{

switch (x)

{

case 1: return "one";

case 5: return "five";

case 10: return "ten";

}

return "unknown";

}

枚举用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型。

任意两个枚举成员不能具有相同的名称

在枚举类型中声明的第一个枚举成员它的默值为0  

允许多个枚举成员有相同的值

没有显示赋值的枚举成员的值,总是前一个枚举成员的值+1

eg:

public enum Number

{

a=1,

b,

c=1,

d

} ;

b的值为2,d的值为2

定义一个简单的枚举代码

public enum WorkDay{ Monday,Tuesday,Wednesday,Thurday,Friday;//定义时,枚举值间有逗号隔开,最后用分号结束 }

废话不多说,直接上main 方法,拿去玩玩吧:

Java代码

public static void main(String []args) { / 枚举类型是一种类型,既然是类型,就是跟int,char他们 一样的, 拿来定义变量,限制你对变量的赋值,就像 int a,你不能够给a一个 string的值 同理,一个枚举用来定义一个变量时,你只能够赋枚举值,其方式为 "枚举名值" / WorkDay myworkday=WorkDayWednesday; / 补充点switch的基础知识,switch语句括号中支持byte \short \char \int类型, jdk 15以后支持枚举,所以,这里可以直接使用枚举变量myworkday。 呵呵,在jdk17后将switch将支持string / switch (myworkday) { /枚举重写了toString()方法,所以枚举变量的值不带前缀 myworkday 里面的值应该是枚举括号里面的那几个 / case Monday: Systemoutprintln("you work day is Monday !"); break; case Tuesday: Systemoutprintln("you work day is Tuesday!"); break; case Wednesday: Systemoutprintln("you work day is Wednesday !"); break; case Thurday: Systemoutprintln("you work day is Thurday !"); break; case Friday: Systemoutprintln("you work day is Friday !"); break; } Systemoutprintln("--------遍历所有值----------"); //----使用values()方法返回一个数组 for(WorkDay day:WorkDayvalues()) { Systemoutprintln(day); } //-----既然是数组,就可以统计大小 Systemoutprintln("WorkDay 里面有 "+WorkDayvalues()length+" 个元素"); //--------------------调用 ordinal()方法,返回枚举值在枚举中的索引,数组索引嘛,当然从0开始 Systemoutprintln(WorkDayMondayordinal()); Systemoutprintln(WorkDayFridayordinal()); //---默认实现javalangComparable接口 ,测试测试 Systemoutprintln(WorkDayMondaycompareTo(WorkDayThurday));//结果应该是 -3 //---Monday的索引为0,Thurday为 3,0-3=-3, Systemoutprintln(WorkDayFridaycompareTo(WorkDayTuesday));//同理,结果应该为4-1=3, }

简单吧,来点狠的,前面说了,枚举有点像类,只是把class换成了enum,那么它跟一般的类一样可以添加属性或方法。

带方法与属性的enum代码

public enum WeAreJavaer{ chinese,java, spring, DB2, AIX; // 枚举列表,必须写在最前面,否则编译出错 private final static String location = "javaeye"; //定义一个属性 public static WeAreJavaer getInfomation() { WeAreJavaer flag=null; if (locationequals("javaeye")) { flag=java; } else { flag= chinese; } return flag; } }

老规矩,直接上main()方法测试:

写道

public static void main(String []ags) { Systemoutprintln("---------------------测试调用枚举中写的方法-------------------------------"); Systemoutprintln("直接调用枚举里面的方法: "+ WeAreJavaergetInfomation()); }

3、来点更狠的。

你可以通过括号来给enum赋值,这样的话,你必须有带参的构造方法,还需要有一属性与方法,否则编译时会出错。

另外,你如果给enum里面的元素赋值的话,要么都赋,要么都不赋,不要东赋一个,西赋一个。

如果不赋值则不能写构造方法,如果你赋值了,而没有构造方法,编译还是通不过,废话不多少,来,看:

可赋值的enum代码

public enum People { xiaowang(20), xiaozhang(32),xiaoli(50), xiaogou(21); private final int age; People(int value) { //构造器只能是默认或者private, 从而保证构造函数只能在内部使用 thisage = value; } public int getAge() { return age; } }

好吧,啥也不说了,接下来的事,你懂地:

测试带值enum代码

public static void main(String[] args) {

for(People people:Peoplevalues()){

/通过getValue()取得相关枚举的值/

Systemoutprintln(people+" 的年龄 :"+peoplegetAge());

}

}

int a=1;

Url u=(Url)a;

var a = typeof(Url)GetField(uToString())GetCustomAttributes(typeof(DescriptionAttribute), false)FirstOrDefault() as DescriptionAttribute;

var d = aDescription;

//d就是你想要的值

MyBatis提供了orgapacheibatistypeBaseTypeHandler类用于我们自己扩展类型转换器,上面的EnumTypeHandler和EnumOrdinalTypeHandler也都实现了这个接口。

1 定义接口

我们需要一个接口来确定某部分枚举类的行为。如下:

public interface BaseCodeEnum {

int getCode();

}

该接口只有一个返回编码的方法,返回值将被存入数据库。

2 改造枚举

就拿上面的ComputerState来实现BaseCodeEnum接口:

public enum ComputerState implements BaseCodeEnum{

OPEN(10), //开启

CLOSE(11), //关闭

OFF_LINE(12), //离线

FAULT(200), //故障

UNKNOWN(255); //未知

private int code;

ComputerState(int code) { thiscode = code; }

@Override

public int getCode() { return thiscode; }

}

3 编写一个转换工具类

现在我们能顺利的将枚举转换为某个数值了,还需要一个工具将数值转换为枚举实例。

public class CodeEnumUtil {

public static <E extends Enum<> & BaseCodeEnum> E codeOf(Class<E> enumClass, int code) {

E[] enumConstants = enumClassgetEnumConstants();

for (E e : enumConstants) {

if (egetCode() == code)

return e;

}

return null;

}

}

4 自定义类型转换器

准备工作做的差不多了,是时候开始编写转换器了。

BaseTypeHandler<T> 一共需要实现4个方法:

void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType)

用于定义设置参数时,该如何把Java类型的参数转换为对应的数据库类型

T getNullableResult(ResultSet rs, String columnName)

用于定义通过字段名称获取字段数据时,如何把数据库类型转换为对应的Java类型

T getNullableResult(ResultSet rs, int columnIndex)

用于定义通过字段索引获取字段数据时,如何把数据库类型转换为对应的Java类型

T getNullableResult(CallableStatement cs, int columnIndex)

用定义调用存储过程后,如何把数据库类型转换为对应的Java类型

以上就是关于学习。求C#中:IndexOf(String, StringComparison) 示例。学习全部的内容,包括:学习。求C#中:IndexOf(String, StringComparison) 示例。学习、c++输入枚举成员名字获得值的方法、Swift-细说枚举(Enum)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/9641556.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存